我在IB的BigView
内放置了一个自定义类NSView
的实例,它是NSScrollView
的子类。我的BigView
的内容大小将在运行时计算。设置内容大小的最佳做法是什么?
根据The Big Nerd Ranch指南中的建议覆盖intrinsicContentSize
不似乎无效 - 框架保持原始大小:
class BigView: NSView {
...
override var intrinsicContentSize: NSSize { // doesn't work?!
return NSSize(width: 10000, height: 10000)
}
...
}
以编程方式(或在IB中)设置框架确实有效:
class BigView: NSView {
...
override func awakeFromNib() {
...
self.frame = NSRect(x: 0, y: 0, width: 10000, height: 10000)
}
...
}I
或来自控制器:
class ViewController: NSViewController {
@IBOutlet weak var bigView: BigView!
...
override func viewDidLoad() {
super.viewDidLoad()
bigView.frame = NSRect(x: 0, y: 0, width: 1000, height: 1000)
}
...
}
这也可以在scrollview的documentView
属性中完成:
class ViewController: NSViewController {
@IBOutlet weak var scrollView: NSScrollView!
...
override func viewDidLoad() {
super.viewDidLoad()
scrollView.documentView?.frame = NSRect(x: 0, y: 0,
width: 1000, height: 1000)
}
...
}
我想也可以使用AutoLayout约束。
什么不能覆盖intrinsicContentSize
工作?
答案 0 :(得分:5)
问题在于,当在较新版本的AppKit中启用translatesAutoresizingMaskIntoConstraints时,会设置默认约束而不考虑内在大小。
要解决此问题,您需要手动添加约束。首先将BigView的位置固定在superview的左上角(应该是NSClipView)。然后转到尺寸检查器,并在内容压缩阻力优先级部分中将内在尺寸设置为占位符。这为您的视图提供了所需的约束,一切都应该在运行时工作。