Kev*_*vin 8 cocoa objective-c nsscrollview
我有一个NSView类,它负责在nib文件中创建的自定义视图.
现在我想将NSScrollView添加到自定义视图,但我需要以编程方式进行,而不是使用Interface Builder(嵌入滚动视图).
我找到了这段代码:
NSView *windowContentView = [mainWindow contentView];
NSRect windowContentBounds = [windowContentView bounds];
scrollView = [[NSScrollView alloc] init];
[scrollView setBorderType:NSNoBorder];
[scrollView setHasVerticalScroller:YES];
[scrollView setBounds: windowContentBounds];
[windowContentView addSubview:scrollView];
Run Code Online (Sandbox Code Playgroud)
假设我将上面的变量'mainWindow'和'scrollView'声明为IBOutlets,我将如何将它们连接到Interface Builder中的适当组件?这样做是否有意义?
或者是否有更好的方法以编程方式添加滚动视图?
PS我无法以通常的方式连接它们因为我无法从Interface Builder创建NSObject对象,或者使用文件所有者.
bri*_*ple 10
我有一个艰难的创造NSScrollView与AutoLayout编程,但最后得到了它的工作.这是Swift版本.
// Initial scrollview
let scrollView = NSScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.borderType = .noBorder
scrollView.backgroundColor = NSColor.gray
scrollView.hasVerticalScroller = true
window.contentView?.addSubview(scrollView)
window.contentView?.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[scrollView]|", options: [], metrics: nil, views: ["scrollView": scrollView]))
window.contentView?.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[scrollView]|", options: [], metrics: nil, views: ["scrollView": scrollView]))
// Initial clip view
let clipView = NSClipView()
clipView.translatesAutoresizingMaskIntoConstraints = false
scrollView.contentView = clipView
scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .left, relatedBy: .equal, toItem: scrollView, attribute: .left, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .top, relatedBy: .equal, toItem: scrollView, attribute: .top, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .right, relatedBy: .equal, toItem: scrollView, attribute: .right, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .bottom, relatedBy: .equal, toItem: scrollView, attribute: .bottom, multiplier: 1.0, constant: 0))
// Initial document view
let documentView = NSView()
documentView.translatesAutoresizingMaskIntoConstraints = false
scrollView.documentView = documentView
clipView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .left, relatedBy: .equal, toItem: documentView, attribute: .left, multiplier: 1.0, constant: 0))
clipView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .top, relatedBy: .equal, toItem: documentView, attribute: .top, multiplier: 1.0, constant: 0))
clipView.addConstraint(NSLayoutConstraint(item: clipView, attribute: .right, relatedBy: .equal, toItem: documentView, attribute: .right, multiplier: 1.0, constant: 0))
// Subview1
let view1 = NSView()
view1.translatesAutoresizingMaskIntoConstraints = false
view1.wantsLayer = true
view1.layer?.backgroundColor = NSColor.red.cgColor
documentView.addSubview(view1)
documentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view1]|", options: [], metrics: nil, views: ["view1": view1]))
// Subview2
let view2 = NSView()
view2.translatesAutoresizingMaskIntoConstraints = false
view2.wantsLayer = true
view2.layer?.backgroundColor = NSColor.green.cgColor
documentView.addSubview(view2)
documentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view2]|", options: [], metrics: nil, views: ["view2": view2]))
// Subview3
let view3 = NSView()
view3.translatesAutoresizingMaskIntoConstraints = false
view3.wantsLayer = true
view3.layer?.backgroundColor = NSColor.blue.cgColor
documentView.addSubview(view3)
documentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view3]|", options: [], metrics: nil, views: ["view3": view3]))
// Vertical autolayout
documentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[view1(==100)][view2(==200)][view3(==300)]", options: [], metrics: nil, views: ["view1": view1, "view2": view2, "view3": view3]))
documentView.addConstraint(NSLayoutConstraint(item: documentView, attribute: .bottom, relatedBy: .equal, toItem: view3, attribute: .bottom, multiplier: 1.0, constant: 0))
Run Code Online (Sandbox Code Playgroud)
此代码片段应演示如何以编程方式创建NSScrollView并使用它来显示任何视图,无论是来自nib还是来自代码.对于nib生成的视图,您只需要先将nib文件加载到自定义视图中,然后将自定义视图(outletToCustomViewLoadedFromNib)的插座添加到File的所有者.
NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:[[mainWindow contentView] frame]];
// configure the scroll view
[scrollView setBorderType:NSNoBorder];
[scrollView setHasVerticalScroller:YES];
// embed your custom view in the scroll view
[scrollView setDocumentView:outletToCustomViewLoadedFromNib];
// set the scroll view as the content view of your window
[mainWindow setContentView:scrollView];
Run Code Online (Sandbox Code Playgroud)
Apple有一个关于这个主题的指南,我不会链接到它,因为它需要Apple Developer Connection访问并且它们的链接经常断开.它的标题是"创建和配置滚动视图",目前可以通过使用Google搜索其标题找到它.
布赖恩的回答是正确的,这里是如何在 Swift 4.2 中创建NSStackViewinsideNSScrollView
见https://github.com/onmyway133/blog/issues/173
你可能需要翻转 NSClipView
final class FlippedClipView: NSClipView {
override var isFlipped: Bool {
return true
}
}
private func setup() {
setupScrollView()
setupStackView()
}
private func setupScrollView() {
view.addSubview(scrollView)
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.hasVerticalScroller = true
scrollView.drawsBackground = false
NSLayoutConstraint.activate([
scrollView.leftAnchor.constraint(equalTo: view.leftAnchor),
scrollView.rightAnchor.constraint(equalTo: view.rightAnchor),
scrollView.topAnchor.constraint(equalTo: view.topAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -30),
scrollView.heightAnchor.constraint(equalToConstant: 400)
])
let clipView = FlippedClipView()
clipView.drawsBackground = false
scrollView.contentView = clipView
clipView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
clipView.leftAnchor.constraint(equalTo: scrollView.leftAnchor),
clipView.rightAnchor.constraint(equalTo: scrollView.rightAnchor),
clipView.topAnchor.constraint(equalTo: scrollView.topAnchor),
clipView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor)
]
scrollView.documentView = stackView
stackView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
stackView.leftAnchor.constraint(equalTo: clipView.leftAnchor),
stackView.topAnchor.constraint(equalTo: clipView.topAnchor),
stackView.rightAnchor.constraint(equalTo: clipView.rightAnchor),
// NOTE: No need for bottomAnchor
])
}
private func setupStackView() {
stackView.orientation = .vertical
stackView.edgeInsets = NSEdgeInsets(top: 16, left: 16, bottom: 16, right: 16)
NSLayoutConstraint.activate([
myRowView.heightAnchor.constraint(equalToConstant: 40)
])
myRowView.onPress = { [weak self] in
self?.doSomething()
}
stackView.addArrangedSubview(myRowView)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7282 次 |
| 最近记录: |