NSSplitView und automatisches Layout
Wie soll ich verwenden Sie auto-layout schränkt innen NSSplitView
Untersicht?
Meine NSSplitView
Untersicht hat 3 Untersicht: topPane
, tableContainer
und bottomPane
und ich die Einschränkungen wie diese:
NSDictionary* views = NSDictionaryOfVariableBindings(topPane, tableContainer, bottomPane);
for (NSView* view in [views allValues]) {
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
}
[myView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topPane(34)][tableContainer][bottomPane(24)]|"
options:0
metrics:nil
views:views]];
[mySplitView addSubview:myView];
Und hab das in die Konsole:
Unable to simultaneously satisfy constraints:
(
"<NSLayoutConstraint:0x7fd6c4b1f770 V:[NSScrollView:0x7fd6c4b234c0]-(0)-[CPane:0x7fd6c4b2fd10]>",
"<NSLayoutConstraint:0x7fd6c4b30910 V:[CPane:0x7fd6c4b2f870(34)]>",
"<NSLayoutConstraint:0x7fd6c4b30770 V:|-(0)-[CPane:0x7fd6c4b2f870] (Names: '|':NSView:0x7fd6c4b22e50 )>",
"<NSLayoutConstraint:0x7fd6c4b212f0 V:[CPane:0x7fd6c4b2fd10]-(0)-| (Names: '|':NSView:0x7fd6c4b22e50 )>",
"<NSLayoutConstraint:0x7fd6c4b2f910 V:[CPane:0x7fd6c4b2f870]-(0)-[NSScrollView:0x7fd6c4b234c0]>",
"<NSLayoutConstraint:0x7fd6c4b21290 V:[CPane:0x7fd6c4b2fd10(24)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fd6c3630430 h=--& v=--& V:[NSView:0x7fd6c4b22e50(0)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fd6c4b1f770 V:[NSScrollView:0x7fd6c4b234c0]-(0)-[CPane:0x7fd6c4b2fd10]>
Ich denke <NSAutoresizingMaskLayoutConstraint:0x7fd6c3630430 h=--& v=--& V:[NSView:0x7fd6c4b22e50(0)]>
Ursachen, aber ich kann nicht zurücksetzen autoresizing Maske, weil NSSplitView
setzt.
Was ist der beste Weg, um auto-layout im inneren-split-Ansicht? Und gibt es eine Möglichkeit, zu behandeln, min/max Größe von split view Untersicht mit auto-layout ohne NSSplitViewDelegate
?
Kommentar zu dem Problem
Gleiche problem hier. Ich legte alles im IB eher als programmatisch, sondern haben ähnlich wie die debugging-Ausgabe, einschließlich der
NSAutoresizingMaskLayoutConstraint
. Dies scheint behoben, die unter 10.8 aber gebrochen, als Sie unter Hinweis 10.7. In 10,8 können Sie die minimale Höhe & Breite der content-Blick auf die geteilte Ansicht in Xcode (4.5.2 sowieso). Dies nicht unter 10.7 und apps mit diesem erstellt 10.8 noch nicht richtig funktionieren 10.7
Im Allgemeinen funktioniert mit 10,8+ aber Einschränkungen müssen angegeben werden, zwischen Untersichten für die meisten Ansichten - nicht supre - oder du wirst die Nicht gleichzeitig zu erfüllen Fehler..
InformationsquelleAutor der Frage Dmitry | 2012-06-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich heraus, dass dieser Fehler erscheint, wenn ich Symbolleiste in mein Fenster und control-split-Ansicht, indem Sie irgendwelche von diesem delegate-Methoden:
Lösung gefunden wurde bei der Befestigung der Symbolleiste auf Fenster in windowDidLoad.
InformationsquelleAutor der Antwort Al Zonke
NSSplitView hat schon eine seltsame Sache ist, da der Anfang und es würde mich nicht überraschen, wenn es werde bald vorbei sein. Nach versuchen, um NSSplitView arbeiten mit AutoLayout für einen Monat jetzt und Untergang von einer Verzweiflung Angriff auf ein anderes, schließlich gab ich auf.
Meine Lösung ist nicht verwenden NSSplitView mit AutoLayout überhaupt. Also entweder NSSplitView ohne Autolayout oder Autolayout ohne NSSplitView: dies ist nicht so kompliziert, wie es klingt: nur das Layout Ihrer Untersichten neben einander und fügen Sie
NSLayoutConstraints
alsIBOutlets
. Die Konstanten dieser Einschränkungen kann dann festgelegt und geändert werden von der controller-code. Mit diesem Ansatz können Sie die Herkunft (negative offset zu schieben Sie es aus dem Fenster), die Breite und die Beziehungen zu anderen Unteransichten - plus es ist wirklich leicht zu animieren Einschränkungen mit der Ansicht animator (schon mal versucht zu animieren eine NSSplitView?)Das einzige, was fehlt, ist das ziehen mit der Maus auf die Teiler, aber dies kann umgesetzt werden mit einem paar von Linien, tracking-mausevents in Ihrem benutzerdefinierten "SplitView".
Gibt es eine autolayout "splitview" - Beispiel von Apple (leider nur vertikal) und ich habe gesehen, mindestens ein neues Projekt auf github in letzter Zeit. Aber für mich, ich dachte, es würde einfacher sein, starten Sie über meine individuelle Lösung für meine Anwendung an die spezifischen Bedürfnisse, anstatt zu versuchen etwas zu schaffen, das sehr universell (so dass es zu Komplex zu handhaben sind).
Edit: ich nun fertig, meine benutzerdefinierte splitView, lädt die Untersichten von separaten Federn. Keine Einschränkung Probleme, kein autolayout-Warnungen. Im Vergleich zu den gesamten Monat zu versuchen, um es zu bekommen Arbeit mit NSSplitView, ich habe jetzt eine funktionierende custom splitView auf der Basis von constraints, leicht animierbar, erstellt in nur einem Abend. Ich definitiv empfehlen, diese route!
InformationsquelleAutor der Antwort auco
10.8 behoben, problem, sehen Sie die dazugehörigen release notes.
Hier ist meine Lösung für 10.7 (eine benutzerdefinierte split view):
https://github.com/benuri/HASplitView.git
InformationsquelleAutor der Antwort Ben-Uri
Für jeden, der stolpert auf diese in die Zukunft und ist auf der Suche nach einem " jump-start in die constraint-basierte
NSSplitView
Ersatz, schrieb ich ein kleines Projekt hier, das versucht nachzubilden, einen Teil desNSSplitView
's features mit Auto-Layout:https://github.com/jwilling/JWSplitView
Es ist etwas buggy, aber es könnte eine nützliche Referenz für alle, die diesen Weg zu gehen.
InformationsquelleAutor der Antwort sudo rm -rf
, Die Sie nicht deaktivieren möchten
translatesAutoresizingMaskIntoConstraints
überhaupt. Sie sollten nicht Durcheinander mit system-views-constraints.NSSplitView
behandelt die Dimensionierung für die einzelnen Ansichten selbst, und Sie sind im wesentlichen versucht, es zu zerreißen, ist die Kontrolle Weg. Nicht zu vergessen, haben Sie vergessen, die Rechnung für die splitter.Den richtigen Weg, um eine minimale oder maximale (oder Konstante für diese Angelegenheit) Breite/Höhe auf einem splitview ist, jene Dinge, auf die Ansichten individuell. Insbesondere, wenn Sie tun dies in code, den Sie verwenden müssen, 2 separate Anrufe zu constraintsWithVisualFormat, weil sonst die visual format language erstellen constraints zwischen den Ansichten.
Können Sie all dies tun in der IB einwandfrei. Sie können auch die Priorität der einzelnen anzeigen in der split-Ansicht, die bewirkt, dass eine oder die andere Ansicht zu der Größe, wenn das Fenster nicht eher, als die Verteilung der Größe gleich.
InformationsquelleAutor der Antwort David Beck
So viel wie ich hasse es nicht, aber Auco Antwort sollte nicht abgestimmt werden, am höchsten. Es ist in keiner Weise hilfreich bei der Lösung des Problems mit einer ausreichenden Menge Arbeit. Meiner Meinung nach ist der NSSplitView war immer nur ein problem für diejenigen, die nicht Lesen Sie die Dokumentation gut genug.
Die tatsächliche Lösung für das problem erwähnt hier ist ziemlich einfach: Auto-Layout eingeführt, das neue "Holding-Prioritäten-API" auf NSSplitView. Und wie die Dokumentation sagt: Festlegung niedrigerer Werte für die holding-Priorität von einer Untersicht wird ihn eher Breite früher. All dies kann eingestellt werden in IB und programmgesteuert und ohne jede Verzweiflung. Die Menge der Arbeit benötigt werden: 20 Sekunden ca.
InformationsquelleAutor der Antwort Jacque
Lade ich alle durch eine nib-Datei und
setTranslatesAutoresizingMaskIntoConstraints:NO
danach.Also vielleicht sollten Sie erst hinzufügen, indem
[mySplitView addSubview:myView];
Ihre Ansichten und deaktivieren Sie danach die übersetzung und die automatische Skalierung der Seiten der Maske zu Zwängen und nach diesem fügen Sie Ihre contraint zumyView
.EDIT:
Ok, es scheint, ich missunderstand die myView.
Sie müssen hinzufügen, dass die Einschränkung der Untersichten und nicht um die splitview.
Sie nicht edge-constraints (die "|" in "V:|[topPane(34)]"), da die Untersichten in
NSSplitView
sind bereits autoresizing.Dies dazu führen, dass dieser z.B. für die topPane Einschränkung:
HINWEIS: ignorieren Sie die Untersicht Inhalt, Sie sind nur Platzhalter
InformationsquelleAutor der Antwort Stephan
Es hat einige Zeit gedauert, bis mein autolayout reinigen von Warnungen, aber ich habe es behandelt in IB (mehrere splitviews und Untersichten).
Mein layout sieht wie folgt aus:
RootView
|--1. NSSplitView (3 vertikale Untersichten)
|----UIView (Links)
|----2. NSSplitView (center & 2 horizontale Untersichten)
|---UIView (oben)
|---3. NSSplitView (unten & 3 vertikale Untersichten)
|---UIView (Links)
|---UIView (Mitte)
|---UIView (rechts)
|----UIView (rechts)
Mein problem war, dass ich hatte 19 Warnungen in alle meine Untersichten aber mein layout sah gut aus und funktionierte, wie es sein sollte.
Nach einer Weile fand ich die Ursache meiner Warnungen: die Zwänge der äußeren Ansichten in meinem ersten splitview.
Beide Ansichten (Links und rechts) hatte eine Breite-Einschränkung mit "Breite >= 200" und die center-Sicht (2. splitview) hatten keine Einschränkungen (weil die min-width und max-width, wo behandelt durch seine subviews).
Warnungen zeigte mir, dass autolayout will, schrumpft mein IB-UI-Layout, weil die berechneten min-breiten, wo kleiner als mein layout, aber ich wollte nicht, es zu verkleinern in IB.
Ich habe eine Feste Beschränkung "width = 200" sowohl von der äußeren Untersichten von meinem ersten splitview und aktiviert "entfernen, die zur build-time".
Nun mein layout ist frei von Warnungen und alles funktioniert wie es sein sollte.
Mein Fazit:
Ich denke, das problem mit autolayout und splitviews ist, dass autolayout nicht verarbeiten kann die Breite-Einschränkungen der Untersichten. Der Grund, den wir verwenden wollen splitviews ist, dass wir möchten, dass die dynamische Breite der Ansichten, und wir wollen, dass es in beide Richtungen, schrumpfen und expans.
Also es ist keine Breite <= xxx && Breite >= xxx . Autolayout kann nur mit einer davon, und wir bekommen Warnungen in IB. Sie können dieses problem beheben mit einer vorübergehenden Einschränkung im IB wird entfernt, bevor runtime.
Ich hoffe, es macht Sinn was ich geschrieben habe, aber es funktionierte gut in meinem Projekt.
PS: ich konnte keine Lösung gefunden, bis heute, wo ich diesen thread gefunden.. so Schätze ich deine Beiträge, die mich inspiriert 🙂
InformationsquelleAutor der Antwort Rikco
Habe ich diese Klasse als ein workaround, es ist nicht perfekt (die Untersichten Stottern ein bisschen), aber es entsperrt mich. Ich verwenden Sie diese Klasse als eigene Klasse innerhalb der einzelnen split-Ansicht.
InformationsquelleAutor der Antwort Mathieu Tozer