2014-10-14 7 views
14

Mit iOS 8 und Xcode 6 haben wir nun in Storyboards das Bildschirmgrößenraster, mit dem wir eine Größenklasse auswählen können. Hier können Sie die Layout-Formatierung für die verschiedenen Bildschirmgrößen auswählen.AutoLayout-Größenklasse programmgesteuert festlegen?

Ich fand das brillant hilfreich, da ich die Grundbedingungen und dann für jede Bildschirmgröße die eindeutigen Bedingungen festlegen kann.

Meine Frage ist, können Sie dies programmgesteuert tun? Ich erstelle meine NSLayoutConstraint als normal, aber ich muss verschiedene Einschränkungen für verschiedene Bildschirmgrößen angeben können.

+2

Sie heißen Größenklasse. – rckoenes

+0

Danke, nicht sicher, wie ich das verpasst habe! Nun, wenn es nur eine Möglichkeit gäbe, Größenklassen programmatisch mit 'NSLayoutConstraint' oder ähnlichem zu spezifizieren. –

Antwort

1

Es ist ein wenig verwirrend & schwer in der Dokumentation zu finden, weil eine "Größenklasse" ist eigentlich keine "Klasse" wie NSObject. Sie sind wirklich in einer Enum definiert/typedef genannt: UIUserInterfaceSizeClass

Die Art und Weise die horizontale & vertikale Größe Klasse erhalten für eine Ansicht mit UITraitCollection ist

Klasse/Typ Methoden für UITraitCollection ermöglicht es Ihnen, eine Basis zu schaffen, auf einer bestimmten Anzeigeskala (z. B. Retina oder nicht), aus einer Reihe anderer Merkmalssammlungen, mit einem UI-Idiom (iPad/iPhone), oder spezifischen horizontalen & vertikalen Optionen (kompakt, regelmäßig), aber um ehrlich zu sein, bin ich nicht sicher noch, wie Sie das verwenden würden ...

This question diskutiert Update-Einschränkungen, wenn die traitColle ction änderungen, mit willTransitionToTraitCollection(newCollection: UITraitCollection!, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator!)

Sie haben Recht, dass sowohl die UITraitCollection und seine Eigenschaften schreibgeschützt sind, aber klar können Sie aus irgendeinem Grund eine neue Sammlung erstellen und Layoutänderungen, wenn die traitCollection ändert.

This previous question ist ziemlich ähnlich & Links zu einem Apple Artikel über die Verwendung von Adaptive Layout. Siehe auch das WWDC-Video "Adaptive Apps mit UIKit erstellen".

+0

Ich sollte die Zeit haben, morgen die WWDC-Videos anzuschauen. Sie können die traitCollection-Eigenschaft einer View- oder Layouteinschränkung jedoch nicht nur lesen. Wie würdest du eine Einschränkung anwenden, um zu einer bestimmten Merkmalsammlung zu gehören? Es ist eine interessante Veränderung, die sie gebracht haben, ich mag es bisher so sehr. –

+0

Eine verwandte Frage zum Ändern von Einschränkungen gefunden und hinzugefügt. Es gibt eindeutig Methoden, um neue UITraitCollections zu erstellen und sie an Methoden zu übergeben, wenn die Ansicht 'willTransitionToTraitCollection' ... aber ich habe nicht genug damit gespielt oder das Video in mehreren Monaten angeschaut. Zeit für mich, noch einen Blick zu werfen! Für mich ist der Prozess und die Dokumentation für das adaptive Layout ziemlich dürftig und verwirrend, wenn man bedenkt, dass es eine so große neue Funktion ist ... Wird es irgendwann herausfinden! – mc01

12

iOS 8 führt die active-Eigenschaft unter NSLayoutConstraint ein. Sie können eine Einschränkung aktivieren oder deaktivieren. Es gibt auch Methoden zum Aktivieren/Deaktivieren mehrerer Einschränkungen.

+ (void)activateConstraints:(NSArray *)constraints 
+ (void)deactivateConstraints:(NSArray *)constraints 
  • Ihre Einschränkungen in Arrays halten, wenn sie programmatisch zu schaffen.
  • Erstellen Sie ein Array für jedes Layout, das Sie benötigen.
  • aktivieren/deaktivieren, was Reihe von Einschränkungen, die Sie benötigen, aus willTransitionToTraitCollection
+0

Danke, aber vielleicht 2017 gibt es einen anderen Weg? –

1

Um Ihre Frage zu beantworten, können Sie die Größenklasse programmatisch festlegen können, ist es jedoch ein bisschen wie ein Schmerz ist. Sie müssen "setOverrideTraitCollection" aufrufen, aber vom übergeordneten Ansichtscontroller, nicht dem, zu dem Sie tatsächlich eine Merkmalsänderung vornehmen möchten.

In meiner Situation wollte ich die Master-VC eines Split-View-Controllers auf iPad ändern, um anders als die auf dem iPhone aussehen, aber beide sind standardmäßig auf kompakte Breite/normale Höhe eingestellt. Also habe ich den Nav-Controller des Masters subclassiert und Code hinzugefügt, um die Eigenschaften des Masters auf Reguläre Breite zu setzen, wenn es kein iPhone ist.

Swift Code:

class MasterNavigationController: UINavigationController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     if (self.traitCollection.userInterfaceIdiom != .Phone) { 
      let newTraitCollection = UITraitCollection(horizontalSizeClass: .Regular) 
      self.setOverrideTraitCollection(newTraitCollection, forChildViewController: self.topViewController) 
     } 
    } 

} 

Ich hoffe, das jemand für eine ähnliche Lösung suchen können.

+0

Sie legen die Größenklasse manuell fest, aber was tun Sie mit den zuvor deklarierten Bedingungen? Wie erkenne ich richtig, zu welchem ​​Merkmal sie gehören? –

+0

Constraints werden für jede Größenklasse im Storyboard festgelegt (mithilfe der Gerätesymbole unten). Hier ist ein Video von der WWDC 2016, in dem sie zeigen, wie sich das in letzter Zeit geändert hat. https://developer.apple.com/videos/play/wwdc2016/236/ –

+0

Ich weiß über Storyboard, aber die Frage war über Einschränkungen programmgesteuert deklariert –