2015-07-04 4 views
7

ich ein Beispielprojekt haben, die das Problem hierWie Einschränkungen nach einer addSubview hinzufügen, damit die Subview mit dem Superview passt die Größe

https://github.com/ericgorr/autolayout_with_addsubview.git

ich CalcView genannt haben einen Blick zeigt, was ich will als programmatisch hinzufügen Unteransicht zu einer Ansicht im Hauptfenster der App. Wenn ich mein Fenster verkleinere, Ich möchte CalcView in der Größe geändert werden.

In windowDidLoad in MainWindowController, füge ich die Subview, indem Sie:

let calcViewController = ELIZCalcView() 
let calcView   = calcViewController.view 

calcContentView?.addSubview(calcViewController.view) 

Ich versuche, die Einschränkungen hinzufügen, indem Sie:

let bindings   = [ "calcView": calcView ] 

let horizontalContraint:[AnyObject] = NSLayoutConstraint.constraintsWithVisualFormat("H:|[calcView]|", options: NSLayoutFormatOptions(0), metrics: nil, views: bindings) 
let verticalContraint:[AnyObject] = NSLayoutConstraint.constraintsWithVisualFormat("V:|[calcView]|", options: NSLayoutFormatOptions(0), metrics: nil, views: bindings) 

calcContentView?.addConstraints(horizontalContraint) 
calcContentView?.addConstraints(verticalContraint) 

Nun, für jemanden, der weiß, wie man richtig zu interpretieren, dass Code ist es sehr offensichtlich, dass es nicht funktioniert. Nachdem ich meine App ausgeführt habe, kann ich das Fenster nicht mehr ändern. Darüber hinaus sehe ich die folgende Fehlermeldung in der Konsole:

2015-07-04 16:04:45.019 aocsCalc[5797:3526462] Unable to simultaneously satisfy constraints: (
    "<NSLayoutConstraint:0x618000082440 V:|-(0)-[NSView:0x600000120f00] (Names: '|':aocsCalc.ELIZHighlightView:0x608000120500)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x618000084100 h=--& v=&-- V:|-(-2)-[NSView:0x600000120f00] (Names: '|':aocsCalc.ELIZHighlightView:0x608000120500)>") 

Will attempt to recover by breaking constraint <NSLayoutConstraint:0x618000082440 V:|-(0)-[NSView:0x600000120f00] (Names: '|':aocsCalc.ELIZHighlightView:0x608000120500)> 

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens. And/or, break on objc_exception_throw to catch this in the debugger. 

Wenn ich die vertikale Einschränkung zu entfernen, geht die Fehlermeldung weg und ich kann das Fenster vertikal skalieren.

Also, welche einfache Sache muss ich tun CalcView wird mit dem Fenster in der Größe geändert?

Antwort

12

Bevor Sie Ihre calcView hinzufügen, um diese Codezeile subview versuchen Einfügen:

calcView.translatesAutoresizingMaskIntoConstraints = false 

Dies sollte Ihr Problem lösen.

Standardmäßig ist diese Eigenschaft in UIView/NSView auf YES/true eingestellt und erstellt basierend auf der Autoresierungsmaske eigene Beschränkungen. Diese automatisch erstellten Einschränkungen stehen in Konflikt mit denen, die Sie im Code erstellt haben.

Dies wird auch in der Fehlerbeschreibung deutlich. In den Zeilen 2 und 3 sehen Sie, dass es zwei vertikale Beschränkungen für eine Ansicht gibt - NSView:0x600000120f00, die Ihr calcView zu sein scheint.

<NSLayoutConstraint:0x618000082440 V:|-(0)-[NSView:0x600000120f00] 
<NSAutoresizingMaskLayoutConstraint:0x618000084100 h=--& v=&-- V:|-(-2)-[NSView:0x600000120f00] 

Sie sind beide vertikal. Zuerst möchte man die Sicht auf die Superview-Oberseite ohne Marge schnappen. Die zweite (automatisch erstellt) möchte sie mit einem kleinen Abstand fangen, vermutlich aus der Anordnung in Interface Builder.

UPDATE

Erstellen Sie ein neues Cocoa-Anwendung-Projekt und fügen Sie den folgenden Code ein:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let view = NSView() 
    view.translatesAutoresizingMaskIntoConstraints = false 
    self.view.addSubview(view) 

    //Making it red just to see a little better. Ignore this two lines. 
    view.wantsLayer = true 
    view.layer?.backgroundColor = CGColorCreateGenericRGB(1, 0, 0, 1) 
    //----------------------------------------------------------------- 

    let views = ["view" : view] 
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|-[view]-|", options: NSLayoutFormatOptions(0), metrics: nil, views: views)) 
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[view]-|", options: nil, metrics: nil, views: views)) 

} 

Neu erstellen NSView auf die View-Controller Hauptansicht mit Standard-Margen aufgeschnappt (8 Punkte, es ist frei als "-" in der visuellen Formatzeichenfolge) und wird mit der Hauptansicht skaliert (siehe Bilder). Ein kleiner Tipp - Sie müssen nicht das "H:" im visuellen Format angeben, nur "V:". Es ist standardmäßig horizontal.

Dies sollte Ihnen eine gute Vorstellung davon geben, wie das Hinzufügen von Einschränkungen programmgesteuert funktioniert. Code ist vielleicht nicht optimal, ich code in Obj-C und kenne sehr wenig Swift.

Ich habe Ihr Projekt heruntergeladen. Der Fehler liegt wahrscheinlich irgendwo in Ihrer komplizierten Ansichtshierarchie und XIB-Manipulation. Aber das ist eine ganz andere Geschichte. Seien Sie auch vorsichtig mit Scroll-Ansichten, sie sind ein bisschen schwierig, wenn es um das automatische Layout kommt, können Sie eine Menge Berichterstattung darüber auf SO finden. Glücklich Codierung :)

enter image description here enter image description here

+0

Ich bin nicht viel Erfahrung mit OS X Entwicklung, aber ich denke, UIView und NSView die gleiche handeln, wenn es um Einschränkungen kommt. [Docs] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/index.html#//apple_ref/occ/instp/NSView/translatesAutoresizingMaskIntoConstraints) sagen, dass NSView dies getan hat diese Eigenschaft. Du musst es falsch eingegeben haben oder so. – NKorotkov

+0

Das Ändern von einem Funktionsaufruf zu einer Eigenschaftszuweisung löste den Kompilierungsfehler, aber das tatsächliche Verhalten, das ich sehe, ist viel schlechter. Die Ansichten sind nicht mehr richtig auf dem Fenster positioniert. Ich habe das Git-Hub-Projekt mit der Änderung aktualisiert. – ericg

+0

Ihre ursprüngliche Frage wurde beantwortet, also sollten Sie erwägen, NKorotkov den Kredit zu geben. Ich habe Ihr aktualisiertes Projekt heruntergeladen und ausgeführt und kann das Problem nicht wirklich erkennen. Sie sollten explizit angeben, was Sie erreichen möchten, aber nicht können - wahrscheinlich in einer separaten Frage (+1 für das Posten von Beispielprojekten übrigens). –

Verwandte Themen