objective-c - 在 NSView - Cocoa 中以编程方式创建 NSScrollView

标签 objective-c cocoa nsscrollview

我有一个 NSView 类,它负责处理在 nib 文件中创建的自定义 View 。

现在我想将 NSScrollView 添加到自定义 View ,但我需要以编程方式进行,而不是使用 Interface Builder(嵌入到 ScrollView )。

我找到了这段代码:

NSView *windowContentView = [mainWindow contentView];
NSRect windowContentBounds = [windowContentView bounds];
scrollView = [[NSScrollView alloc] init];
[scrollView setBorderType:NSNoBorder];
[scrollView setHasVerticalScroller:YES];
[scrollView setBounds: windowContentBounds];
[windowContentView addSubview:scrollView];

假设我将上面的变量“mainWindow”和“scrollView”声明为 IBOutlets,我将如何将它们连接到 Interface Builder 中的适当组件?这样做有意义吗?

或者是否有更好的方式以编程方式添加 ScrollView ?

附言我无法以通常的方式连接它们,因为我无法从 Interface Builder 创建 NSObject 对象,或使用文件所有者..

最佳答案

我在以编程方式使用 AutoLayout 创建 NSScrollView 时遇到了困难,但最终让它工作了。这是一个 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))

enter image description here

关于objective-c - 在 NSView - Cocoa 中以编程方式创建 NSScrollView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016475/

相关文章:

objective-c - 如何覆盖 webView 可以处理的重定向数量。 Obj-C, cocoa

Swift:包含 NSTextViews 的 NSScrollView 无法正确滚动

objective-c - 在标准 NSWindow 上创建自定义标题栏

ios - SWRevealViewController 错误。构建失败,但没有错误

cocoa - 如果其他应用程序打开,如何以编程方式启动我的应用程序?

objective-c - 如何使复选框单元格中的文本能够被编辑?

cocoa - NSScroller 不会自动隐藏并为自己生成一个新的 NSTableColumn

iphone - 向 UIImageView 添加反射的最有效方法是什么

ios - UIView 动画在 iOS 7 中不起作用

iphone - 将大数从 NSString 转换为 NSNumber