为什么在NSView中覆盖NSintView中的inintsicContentSize不起作用?

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。这样就给您的视图带来了所需的约束,并且一切都应在运行时正常工作。