2016-06-08 14 views
1

Ich erstelle eine benutzerdefinierte modale Ansicht, die eine Reihe von UILabels, UIImages usw. enthält und als modale Ansicht angezeigt wird. Die Ansicht muss das automatische Layout verwenden und muss programmgesteuert ausgeführt werden und nicht mit Storyboard/xibs (leider).iOS-Auto-Layout-Visual-Format - Wie Abstand einstellen, um einen Wert zu versuchen, aber auf einen anderen für kleinere Bildschirme fallen?

Die modale Ansicht wächst mit dem Inhalt bis zu 8 Punkten von der Kante (oben, unten, links, rechts) des Bildschirms.

Ein Großteil der Ränder zwischen untergeordneten Ansichten sind 16 und 24 Punkte. Das ist alles auf neueren iPhones und im Portrait-Modus, und lässt viel Platz zwischen dem Bildschirm und der modalen Ansicht. Wenn jedoch in Querformat gedreht wird, trifft die modale Ansicht die Grenze von 8 pt von der oberen/unteren Kante und viele der untergeordneten Ansichten werden vollständig verkleinert.

Die Lösung dafür ist die Änderung aller "Ränder" zwischen den Kindansichten auf 8 Punkte. Dies erlaubt alles, genug Platz zu zeigen.

Mein Ziel ist es, in der Lage zu sein, die Ränder dynamisch anzupassen, so dass sie den höheren Wert "versuchen" (dh 16, 24), aber auf einen kleineren Wert (dh 8) "zurückfallen" den Bildschirm füllen.

Ich weiß, eine Methode besteht darin, mehrere Constraints zu verwenden und sie nur zu wechseln, wenn die Ausrichtung geändert wird, aber ich möchte diese Route nicht verwenden, da es mit der Zeit mühsam sein kann, Änderungen zu verwalten gemacht.

Ich habe einen Leckerbissen ein finden, während die Rückseite die Sie so etwas wie dies mit Prioritätswerten tun könnten:

NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-([email protected],[email protected])-[titleLabel]-[detailsLabel]-([email protected],[email protected])-[button(40)]-([email protected],[email protected])-|", options: [.AlignAllCenterX], metrics: metrics, views: views)) 

Dies ist jedoch immer auf den ‚8 @ 900‘ Wert fällt zurück, auch wenn viele es von Raum für die Aussicht, in der Höhe zu wachsen.

Ich habe auch versucht diese, die für einige der untergeordneten Ansichten richtig zu funktionieren scheint, aber nicht alle von ihnen:

NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-(>=8,<=24)-[titleLabel]-[detailsLabel]-(>=8,<=24)-[button(40)]-(>=8,<=24)-|", options: [.AlignAllCenterX], metrics: metrics, views: views)) 

Antwort

3

Es ist nicht zurück bis 8 fällt, 8 eine höhere Priorität als Einschränkung 24 so wird es das tun, wenn es möglich ist. In Auto Layout 1000 wird als erforderlich erachtet (d. H., Wenn es zwei sich gegenseitig ausschließende 1000-Prioritätsbedingungen gibt, sehen Sie eine Reihe von Fehlern im Protokoll). Umgekehrt gelten die Prioritäten 0 - 999 als optional. Alles, was optional ist, kann vom System gebrochen werden, um die erforderlichen Einschränkungen zu erfüllen, und Sie wählen im Wesentlichen einen Wert zwischen 0 und 999, um die Reihenfolge anzugeben, in der sie gebrochen werden sollen (0 ist zuerst gebrochen, 999 ist zuletzt gebrochen) . Es ist auch erwähnenswert, dass verschiedene System-Dinge bei various priorities passieren.

Ich würde in Betracht ziehen, Ihr Problem zu lösen, indem Sie den kleineren Rand eine Ungleichheit mit der erforderlichen Priorität (1000) und den größeren Rand eine Gleichheit mit der Priorität 999 machen. Auf diese Weise wird versucht, den 24-Punkt-Wert zu verwenden, aber wenn es nicht geht Wenn Sie also die anderen erforderlichen Einschränkungen einhalten, wird es so klein wie 8 Punkte.

Es ist erwähnenswert, dass diese beiden Lücken wahrscheinlich nicht in gleichem Maße reduziert werden. Um dies zu erreichen, müssen Sie möglicherweise etwas kompliziertes tun, wie die Verwendung verborgener Ansichten (versteckte Ansichten wirken sich immer noch auf das Layout aus), die direkt an die Superansicht angeheftet sind, und die Beschriftungen mit einer erforderlichen Höhe von> = 8 und einer Höhe von 24 @ 999 . Dann können Sie diese beiden versteckten Ansichten auch einander gleich machen. Wenn Sie iOS 9.x + unterstützen können, verwenden Sie stattdessen UILayoutGuide.

NSLayoutConstraint.constraintsWithVisualFormat("V:|-(>=8,[email protected])-[titleLabel]-[detailsLabel]-(>=8,[email protected])-[button(40)]-(>=8, [email protected])-|", options: [.AlignAllCenterX], metrics: metrics, views: views) 
+0

(> = 8,24 @ 999) löste mein Problem für alle Ränder. Funktioniert perfekt ohne versteckte Ansichten zu benötigen. Vielen Dank!! – JimmyJammed

0

Ich denke, ich würde die Einschränkungen anpassen, wenn sich die Größenklasse ändert. Anstatt mehrere Abhängigkeiten zu haben, passen Sie einfach die Konstante von 16 auf 8 an, wenn sich die Größenklasse ändert.

if (self.view.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) 
    // set constraints which implement margins to constant of 8 
else 
    // set constraints which implement margins to constant of 16 

Weitere Informationen here.