2016-10-04 10 views
9

Es gibt einige große Änderungen in 10.12, aber meiner Meinung nach ist das größte das neue Auto-Layout-System (oder geändert/neu geschrieben alten ... wer weiß). Ich habe ein einfaches Projekt vorbereitet, um das Problem zu demonstrieren. Es bezieht sich auf das Kollabieren eines Split-View-Objekts über eine Schaltfläche. Es passiert nur am 10.12. Alles, was Sie tun müssen, ist das Projekt zu kompilieren und klicken Sie auf die Schaltfläche. Ein Fehler wird angezeigt:macOS 10.12 Auto-Layout Probleme

2016-10-04 15: 10: 28.284296 test-12 [64932: 7425277] [Layout] Erkannte fehlende Einschränkungen für. Es kann nicht platziert werden, da nicht genügend Einschränkungen vorhanden sind, um die Größe und den Ursprung vollständig zu definieren. Fügen Sie die fehlenden Einschränkungen hinzu, oder legen Sie translatedAutoresizingMaskIntoConstraints = YES fest, und die Einschränkungen werden für Sie generiert. Wenn diese Ansicht manuell auf macOS 10.12 und höher erstellt wird, können Sie wählen, [Super-Layout] nicht von Ihrer Überschreibung aufzurufen. Setzen Sie einen Breakpoint auf DETECTED_MISSING_CONSTRAINTS, um zu debuggen. Dieser Fehler wird nur einmal protokolliert.

Nach einen Haltepunkt setzen wir herausfinden können, dass die problematische Ansicht ist:

(lldb) po $arg1 
<NSSplitDividerView: 0x618000161980> 

Bin ich völlig falsch, oder es gibt ein bestimmtes Problem mit 10,12? Und bitte beraten Sie, wie Sie solche Fehler nach Möglichkeit vermeiden können.

Das Projekt kann von github

einmal danke Ihnen nochmals für die Hilfe heruntergeladen werden.

I. Nikolov

+2

Ich kann diese Nachricht einfach durch Aufrufen von NSAlert.layout() auslösen, um die Warnung zu erzwingen, sich sofort auszugeben. Da keiner der Vorschläge in diesem Fall funktioniert und es keine offensichtliche Möglichkeit gibt, den Fehler zu vermeiden, habe ich ein Radargerät angemeldet (rdar: // 28700495). – rsfinn

+4

Ich behebe dieses Problem, indem ich "falsch" von "splitView" (_ splitView: NSSsplitView, sollteHideDividerAt dividerIndex: Int) zurückgeben -> Bool "in meinem' NSSplitViewController'. – LShi

+0

@LShi: Danke ich hatte das gleiche Problem und es hat auch für mich funktioniert. – mschmidt

Antwort

0

Ich habe das gleiche Auto-Layout Problem, und ich eine Lösung für mein Projekt gefunden. Nachdem ich die Subview mit ihren Constraints hinzugefügt habe, rufe ich das Fenster auf "layout" auf. Leider mache ich das nach jedem "add" Aufruf, sonst wird das System die hässliche Nachricht erneut werfen. Es funktioniert für mich und ich rufe es nur während der Initialisierung an.

// Left Split View 
    [self.scrollviewMain setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.viewMainLeft addSubview:self.scrollviewMain]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeBottom multiplier:1.0 constant:l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeTop multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeLeft multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeRight multiplier:1.0 constant:l_floatConstant]]; 
    [self.windowMain layoutIfNeeded]; 
    // Right Split View 
    [self.scrollviewDetails setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.viewMainRight addSubview:self.scrollviewDetails]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeBottom multiplier:1.0 constant:l_floatConstant]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeTop multiplier:1.0 constant:-l_floatConstant-1]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeLeft multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeRight multiplier:1.0 constant:l_floatConstant]]; 
    [self.windowMain layoutIfNeeded]; 
+0

Aber ... Sie sollten zustimmen, dass dies nicht der richtige Weg ist, Layout zu tun ... Es ist definitiv etwas falsch ... oder zumindest falsch interpretiert. Wie auch immer - danke für die Info. Es gibt mehrere solche Problemumgehungen, die meiner Meinung nach weder effizient noch raffiniert sind. Hoffen wir, dass sich die Dinge in Zukunft ändern werden, oder wir werden mehr Informationen bekommen, wie wir solche Situationen verhindern können. –

Verwandte Themen