2017-07-25 71 views
0

我已經在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

回答

3

問題是,當在較新版本的AppKit中啓用translatesAutoresizingMaskIntoConstraints時,默認約束設置時不考慮內在大小。

要解決此問題,您需要手動添加約束。首先將BigView的位置固定到superview的左上角(應該是NSClipView)。然後轉到尺寸檢查器,並在內容壓縮阻力優先部分集固有尺寸佔位符。這就給你的視圖提供了它所需要的約束,並且一切都應該在運行時運行