2017-07-25 3 views
0

Ich habe eine Instanz der benutzerdefinierten Klasse BigView platziert, die eine Unterklasse von NSView innerhalb einer NSScrollView in IB ist. Die Inhaltsgröße meines BigView wird zur Laufzeit berechnet. Was ist die beste Vorgehensweise zum Festlegen der Inhaltsgröße?Warum kann `intrinsicContentSize` in` NSView` nicht überschrieben werden, um `NSScrollView` zu verwenden?

intrinsicContentSize Aufschalten, wie im The Big Nerd-Ranch Führung vorgeschlagen, nicht nicht zu funktionieren scheint - der Rahmen in seiner Originalgröße bleibt:

class BigView: NSView { 
    ... 
    override var intrinsicContentSize: NSSize { // doesn't work?! 
     return NSSize(width: 10000, height: 10000) 
    } 
    ... 
} 

den Rahmen einstellen programmatisch (oder in IB) funktioniert:

class BigView: NSView { 
    ... 
    override func awakeFromNib() { 
     ... 
     self.frame = NSRect(x: 0, y: 0, width: 10000, height: 10000) 
    } 
    ... 
}I 

oder von der Steuerung:

class ViewController: NSViewController { 
    @IBOutlet weak var bigView: BigView! 
    ... 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     bigView.frame = NSRect(x: 0, y: 0, width: 1000, height: 1000) 
    } 
    ... 
} 

Dies kann auch während der gesamten documentView Eigenschaft Scroll erfolgen:

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

Ich nehme man auch als auch Automatisches Layout Einschränkungen nutzen könnte.

Was überschreibt intrinsicContentSize nicht?

+0

Genau das gleiche Problem. Ich habe die Einstellung translateAutoresizingMaskIntoConstraints in der inneren Ansicht auf NO in der Ansicht in der XIB gefunden oder durch Überschreiben der Methode das Problem behoben. Aber jetzt bekomme ich zur Laufzeit eine Warnung über fehlende Einschränkungen. – Matt

Antwort

3

Das Problem ist, dass wenn translatedAutoresizingMaskIntoConstraints in neueren Versionen von AppKit aktiviert ist, Standardeinschränkungen ohne Berücksichtigung der inneren Größe festgelegt werden.

Um dies zu beheben, müssen Sie die Einschränkungen manuell hinzufügen. Fixiere zuerst die Position deines BigViews oben links im Superview (sollte der NSClipView sein). Dann gehen Sie zum Größeninspektor, und in der Inhalt Kompressionswiderstand Priorität Abschnitt festgelegt Intrinsic Größe bis Platzhalter. Das gibt Ihrer Ansicht die Einschränkungen, die es benötigt, und alles sollte zur Laufzeit funktionieren.

Verwandte Themen