【问题标题】:Why doesn't overriding `intrinsicContentSize` in `NSView` work for `NSScrollView`?为什么在`NSView`中覆盖`intrinsicContentSize`不适用于`NSScrollView`?
【发布时间】:2017-07-25 17:46:32
【问题描述】:

我在 IB 的 NSScrollView 中放置了一个自定义类 BigView 的实例,它是 NSView 的子类。我的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)
   }
   ...
}

这也可以在整个滚动视图的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 工作?

【问题讨论】:

  • 遇到了完全相同的问题。我发现将内部视图上的 translatesAutoresizingMaskIntoConstraints 设置为 xib 视图上的 NO 或通过覆盖该方法来解决问题。但现在我在运行时收到关于缺少约束的警告。

标签: nsview appkit nsscrollview


【解决方案1】:

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

要解决此问题,您需要手动添加约束。首先将 BigView 的位置固定在 superview 的左上角(应该是 NSClipView)。然后转到 Size Inspector,在 Content Compression Resistance Priority 部分将 Intrinsic Size 设置为 Placeholder。这为您的视图提供了所需的约束,并且一切都应该在运行时正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2012-07-15
    相关资源
    最近更新 更多