wco*_*ran 1 nsview appkit nsscrollview
我放置了一个自定义类的实例,该实例BigView是IB NSView内部的子类NSScrollView。my的内容大小BigView将在运行时计算。设置内容大小的最佳做法是什么?
重写intrinsicContentSize,因为大书呆子牧场指南中的建议,并没有似乎工作-框架仍保持其原始尺寸:
class BigView: NSView {
...
override var intrinsicContentSize: NSSize { // doesn't work?!
return NSSize(width: 10000, height: 10000)
}
...
}
Run Code Online (Sandbox Code Playgroud)
以编程方式(或在IB中)设置框架确实有效:
class BigView: NSView {
...
override func awakeFromNib() {
...
self.frame = NSRect(x: 0, y: 0, width: 10000, height: 10000)
}
...
}I
Run Code Online (Sandbox Code Playgroud)
或从控制器:
class ViewController: NSViewController {
@IBOutlet weak var bigView: BigView!
...
override func viewDidLoad() {
super.viewDidLoad()
bigView.frame = NSRect(x: 0, y: 0, width: 1000, height: 1000)
}
...
}
Run Code Online (Sandbox Code Playgroud)
这也可以在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)
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想也可以使用AutoLayout约束。
什么不压倒一切intrinsicContentSize?
小智 5
问题在于,在较新版本的AppKit中启用了translatesAutoresizingMaskIntoConstraints时,会设置默认约束,而不会考虑内部大小。
要解决此问题,您需要手动添加约束。首先,将BigView的位置固定在超级视图的左上方(应该是NSClipView)。然后转到“大小”检查器,然后在“ 内容压缩优先级”部分中,将“ 固有大小”设置为Placeholder。这样就给您的视图带来了所需的约束,并且一切都应在运行时正常工作。