为什么不覆盖`NSView`中的`intrinsicContentSize`为`NSScrollView`工作?

时间:2017-07-25 17:46:32

标签: nsview appkit nsscrollview

我在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工作?

1 个答案:

答案 0 :(得分:5)

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

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