2013-01-07 5 views
32

Ich muss translatesAutoresizingMaskIntoConstraints auf NO setzen. Standardmäßig ist es auf YES eingestellt (um bei den meisten Apps zu helfen, die von Struts und Federn zum neuen Auto-Layout wechseln).Wo zu setzen TranslateAutoresizingMaskIntoConstraints in Xcode 4.5

Gibt es irgendwo in Xcode, wo der Standard von YES zu NO geändert werden kann?

Oder muss ich es manuell für jede Ansicht einstellen?

Antwort

17

Das ist eine gute Frage - und ich habe versucht, eine Antwort auf mich selbst zu finden. Leider sieht es so aus, als gäbe es keine "schnelle Lösung". Derzeit Apple hält Constraint-basierte Layout Opt-in - sogar einen Abschnitt der UIView Class Reference Benennung:

in Opting Constraint-basierten Layout-

Aber das Opt-in ist nicht global. Ich nehme an, dies ist, weil nicht alles gut aussieht, wenn Sie einfach Springs & Struts in Constraints drehen. Einige UI-Elemente brechen, oder Sie erhalten eine Menge unerfüllbarer Constraints.

kann ich denke an eine möglich Lösung - ich habe es selbst nicht ausprobiert, aber man konnte eine Kategorie UIView machen, dass alleUIView Objekte setzt NO für - (BOOL)translatesAutoresizingMaskIntoConstraints zurückzukehren. Während ich nicht weiß, was das brechen würde, würde es global setzen translatesAutoresizingMaskIntoConstraints zu NO.

Hier ist a good introduction to Categories if you want to learn more about them!

+0

Wie verwenden Sie eine Kategorie alle UIView-Objekt zu setzen nicht zurück? Die Kategoriemethode gilt nur für eine Instanz. – Boon

+2

Diese Antwort wurde angenommen, aber hat es funktioniert?Ich würde erwarten, dass dieser Ansatz problematisch ist. –

+0

Die Kategoriemethode überschneidet die ursprüngliche Methode @Boon und jede Instanz verwendet die neue Implementierung. [Es sei denn, die ursprüngliche Methode wurde selbst in einer Kategorie implementiert] (http://stackoverflow.com/a/7013922/603977). –

3

Wenn Sie die Größe oder Position Ihrer Unteransicht ändern müssen. Verwenden Sie die Methode (BOOL)translatesAutoresizingMaskIntoConstraints, bevor Sie den Rahmen Ihrer Unteransicht festlegen.

[self.benchmarkButton removeFromSuperview]; 
[self.benchmarkButton setTranslatesAutoresizingMaskIntoConstraints:YES]; 
[self.benchmarkButton setFrame:CGRectMake(20, self.benchmarkButton.frame.origin.y+40, 260, 30)]; 
[self.benchmarksView addSubview:self.benchmarkButton]; 

Das ist Weg, um Ihre Subview nicht von Einschränkungen kämpfen, wie es Standard (Autolayout) in Xcode 4.3 und später ist. Danke

+0

Schön, aber ich vermute, dass Sie mit Konflikten auf diese Weise enden könnten, anstatt darüber nachzudenken, mit den bestehenden Einschränkungen zu arbeiten. –

17

Ich bin zu spät zu dieser Frage, aber die erwähnte Option fehlt noch in Xcode 5 & 6, so ist die Frage immer noch sinnvoll.

Eigentlich können wir immer einen Wert für eine Eigenschaft eines View/Control/Objekts setzen, indem wir ein User Defined Runtime Atribute im Storyboard (Interface Builder) wie im folgenden Screenshot hinzufügen.

Und es funktioniert auch für translatedAutoresizingMaskIntoConstraints. So könnte die Frage gelöst werden.

enter image description here

+0

Dies ist eine glatte Lösung, aber ich glaube, dass es zu einem "Einfrieren" in XCode 6.3 Beta 2 führte. Als ich es entfernte, lud meine Ansicht richtig ... aber damit stürzte es, nachdem ich auf Beta 2 aufgerüstet hatte. –

+2

Dies funktioniert in XCode 9 und iOS 11 für alle, die nach einer aktualisierten Lösung suchen. Dies sollte jetzt die akzeptierte Antwort sein. – JasonD