为什么不重写`NSView`中的`intrinsicContentSize`为`NSScrollView`工作?

问题描述:

我已经在IB中的NSScrollView内放置了一个自定义类BigView的实例,该实例是NSView的子类。我的BigView的内容大小将在运行时计算。设置内容大小的最佳做法是什么?为什么不重写`NSView`中的`intrinsicContentSize`为`NSScrollView`工作?

重写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) 
    } 
    ... 
} 

这也可以在整个滚动视图的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) 
    } 
    ... 
} 

我想人们也可以使用自动版式限制为好。

什么不覆盖intrinsicContentSize工作?

+0

得到完全相同的问题。我发现在xib视图中将内部视图的translatesAutoresizingMaskIntoConstraints设置为NO,或者通过覆盖该方法来修复问题。但是现在我在运行时会收到关于缺少约束的警告。 – Matt

问题是,当在较新版本的AppKit中启用translatesAutoresizingMaskIntoConstraints时,默认约束设置时不考虑内在大小。

要解决此问题,您需要手动添加约束。首先将BigView的位置固定到superview的左上角(应该是NSClipView)。然后转到尺寸检查器,并在内容压缩阻力优先部分集固有尺寸占位符。这就给你的视图提供了它所需要的约束,并且一切都应该在运行时运行