2013-10-29 5 views
24

Während es viele Fragen und Antworten zum Erstellen eines Storyboardlayouts gibt, das sowohl auf 4 "als auch 3,5" Bildschirmgrößen funktioniert, konnte ich keine geeignete Lösung für das folgende Szenario finden.Wie kann ich ein Storyboard für 4 "und 3,5" iphone Bildschirme mit automatischem Layout (ios6 + ios7) verwenden?

Ich benutze automatisches Layout mit ios6 (und ios7), und ich muss nicht Landscpae oder ipad unterstützen. Ich habe eine UIView mit mehreren Subviews, die wie das Mockup unten aussehen müssen. Es ist einfach, Beschränkungen für die automatische Belichtung im Storyboard so einzurichten, dass sie zu beiden Bildschirmgrößen passen. Meine Frage ist - Wie mache ich Auto-Layout wählen Sie die richtigen Einschränkungen abhängig von der Bildschirmgröße zur Laufzeit?

SCREEN MOCKUPS

Beachten Sie, dass ich möchte nicht 2 verschiedene Storyboards verwenden. Es wäre eine Menge Arbeit, dies über meine gesamte Anwendung hinweg zu tun, und ich müsste alle Delegierten, Verkaufsstellen und Aktionen auf jedem Storyboard anschließen. Eine Änderung in einem Bildschirm würde erfordern, dass ich die doppelte Arbeit mache.

Ich habe 2 Methoden ausprobiert, um dies auf einem Storyboard zu machen, aber ich bin mit keinem von beiden zufrieden.

  • Verdoppeln Sie die Einschränkungen. Die größere Einschränkung (50) hat eine höhere Priorität als die untere Einschränkung (30). Das Problem bei diesem Ansatz ist, dass auf der 3,5" Bildschirmgröße, automatisches Layout eine nur wenige niedrigere Priorität Einschränkungen aufheben kann - genug, um das Layout zu befriedigen -. Aber einige hohe Priorität Einschränkungen verlassen

double constraints

  • Unterklasse NSLayoutConstraint Bei dieser Methode werden alle Einschränkungen im Storyboard auf NSDualLayoutConstraint gesetzt.In dem Initialisierungscode von NSDualLayoutConstraint wird die Konstante der Einschränkung auf den Wert 3_5_constant geändert, wenn die Runtime-Bildschirmgröße 3,5 Zoll beträgt. Diese Methode ist deterministisch, aber Sie können das 3.5" Layout in der Interface Builder Vorschau nicht sehen.

enter image description here


Wenn nur Interface Builder Einschränkungen hatten einen sekundären konstanten Wert, die angewandt werden würden wenn die Bildschirmgröße 3,5 "ist, würde es mein Problem lösen. Also bleibe ich bei meiner Frage - wie kann ich ein einzelnes Storyboard richtig verwenden, um seine Subviews korrekt für 4" UND 3,5 "Bildschirmgrößen zu gestalten?

+0

Ich würde Ihnen empfehlen, es in diesen Fällen programmgesteuert zu tun! – Zalykr

+0

@Heliem, programmgesteuert wird er aufgefordert, Bedingungen auf seinen ViewControllern hinzuzufügen, um zwischen 3.5 "und 4.0" zu wählen. Es gibt wirklich keinen Unterschied neben all dem zusätzlichen Code. – Indigon

+0

@Indigon nicht genau, ich denke, er hat nur Probleme in den Fällen, in denen er verschiedene Einschränkungen abhängig von der Bildschirmgröße will. Wenn ja, könnte er nur diese programmatisch tun – Zalykr

Antwort

1

Sie müssen Ihre Einschränkungen programmatisch bearbeiten. You may find this question helpful for that.

Sie könnten auch zwei separate Storyboard-Dateien oder zwei viewController-Szenen in einer Storyboard-Datei haben.

+0

Meine zweite Annäherung an das Problem beinhaltet programmgesteuert Änderung der Einschränkungen (durch Unterklassen NSLayoutconstraint'; Und meine Frage speziell fragt für eine Lösung mit einem Storyboard – gardenofwine

6

Wenn Sie nur ein Storyboard verwenden möchten und Sie nicht das automatische Layout verwenden möchten, was Ihr Leben für das, was Sie in Ihrem Diagramm gezeigt haben, einfacher macht, müssen Sie Ihre Ansichten im Code strukturieren.

Sie müssen nur feststellen, ob der Benutzer auf einem 4 "Gerät läuft und Ihre Ansichten entsprechend gestalten.

#define IS_568_SCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON) 

if (IS_568_SCREEN) { 
    // Lots of code to layout for 4" devices 
} else { 
    // Lots of code to layout for 3.5" devices 
} 

Wenn Sie jedoch für diesen Einsatz automatischen Layout, würden finden Sie es Ihnen eine Menge Zeit und Code zu speichern. Anstatt jede Ansicht im Code mit der oben erwähnten Lösung manuell zu gestalten, müssen Sie lediglich die Y- und Höhenbeschränkungen je nach Gerät aktualisieren.

Betrachtet man dieses Diagramm, das zeigt, was für Sie automatisches Layout behandeln würde und was Sie manuell aktualisieren müssten, sollte dies ein besseres Bild davon vermitteln, wie viel Sie mit dem automatischen Layout sparen.

enter image description here

#define IS_568_SCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON) 

if (IS_568_SCREEN) { 
    self.layoutConstraintY.constant = 50.0f; 
    self.layoutConstraintHeight.constant = 248.0f; 
} else { 
    self.layoutConstraintY.constant = 30.0f; 
    self.layoutConstraintHeight.constant = 220.0f; 
} 
[self layoutIfNeeded]; 
+0

Meine Frage war in der Tat über Auto-Layout, also kommentieren ich über Ihren zweiten Vorschlag - das ist, die Einschränkungen über Code zu bearbeiten. Das ist ein Vorschlag, den ich in meiner Frage gefunden habe. Siehe diesen Kommentar Ich machte zu einem anderen Antwortgeber: http://stackoverflow.com/questions/19658140/how-can-i-use-on-storyboard-for-4-and-3-5-iphone-screens-with-autolayout-ios/21285047? Noredirect = 1 # comment29195363_19658140 – gardenofwine

+1

Danke für solch eine detaillierte Antwort – nicktones

+0

Der gewundene Tanz mit 'fabs()' und 'DBL_EPSILON' ist total unnötig.Ich habe gesehen, wie es im Zusammenhang mit der Überprüfung der Bildschirmgröße um einen Haufen kopiert wurde, und es basiert auf einem Missverständnis der Probleme mit Gleitkomma-Rundung. In diesem Zusammenhang ist '==' völlig in Ordnung. (Wahrscheinlich möchten Sie auch eine Ungleichung verwenden, so dass, wenn Apple einen noch größeren Bildschirm freigibt, es nicht zum 3,5 "Layout zurückkehrt.) –

2

Diese stackoverflow answer hat das gleiche Problem für mich gelöst.

Schlüssel ist machen ein IBOutlet zu der Einschränkung (z. B. Höhe). Dann tun Sie etwas wie das

- (void)updateViewConstraints { 
    [super updateViewConstraints]; 

    self.myConstraintFromIB.constant = 
     [UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100; 
} 
+0

Ich hatte bereits eine bessere Lösung in meiner Frage vorgeschlagen (subclassing NSLayoutConstraint - NSDualLayoutConstraint) – gardenofwine

+0

Dies ist eine schlechte Antwort, obwohl es meine eigene ist Bitte verstehen Sie Ihr Problem mehr und Sie können es lösen, ohne eine Überprüfung wie folgt zu machen – carbonr

1

Wie wäre es mit einer zusätzlichen Ansicht und einschließlich der quadratischen Ansicht drin? Die zusätzliche Ansicht sollte transparent sein, damit niemand sie sieht. Legen Sie die Einschränkungen der Extraansicht so fest, dass sie mit der Bildschirmgröße erweitert werden, und legen Sie fest, dass die Beschränkungen der Quadratansicht in der Extra-Box zentriert sind. Wählen Sie einen Multiplikator für die quadratische Ansicht Größe im Vergleich zu der zusätzlichen Box

+0

Was anders ist Ihr Vorschlag, als Multiplikator Beschränkungen auf die quadratische Ansicht selbst einstellen? – gardenofwine