2015-01-06 23 views
15

Ich baue eine neue App und möchte eine "Welcome Walkthrough" am Anfang, wo ich ein Storyboard mit einer Reihe von Bildern in einem UIPageViewController vorgestellt haben. Ich habe es laden die Bilder und alles in Ordnung, aber die Bilder werden in der Größe geändert, wenn sie über den "vorherigen" oder "nächsten" ViewController gehen. Ich verwende Swift zu entwickeln. HierUIImageView Größe ändern Problem in UIPageViewController

ist ein Video von der Frage: http://youtu.be/dXcjjT-8Bk0

Ich habe all die verschiedenen Ansichtsmodi versucht (Aspect fit, Aspekt füllen, neu zu zeichnen etc.) und sie alle gleich verhalten.

Ich benutze Auto-Layout + Size-Klassen, wie ich die Entwicklung für verschiedene Bildschirmgrößen vereinfachen möchte. Die aktuellen Einschränkungen Ich habe, die die UIImage machen in der richtigen Größe angezeigt werden, sind:

Align Centre X to Superview 
Top Space to Top Layout Guide 
Bottom Space to Bottom Layout Guide + Equals: 50 

ich derzeit Aspect Fit bin mit der mich das richtige Bild gibt (nachdem sie ihre ‚Größe ändern Verhalten‘ getan haben

Can. Irgendjemand führe mich weiter, wie man das beheben kann?

Antwort

14

Von Ihrem Video, habe ich festgestellt, dass Ihre UIImageView immer "Größe" an der Spitze, nicht an der Unterseite ist. Dies ist sicherlich wegen Ihrer automatischen Layout-Einschränkung Sie rufen " Top Space to Top Layout Guide ". Während Ihre UIImageView 's Ansicht Controller wird durch Ihren Scrolling-Seitenaufruf-Controller geleitet, er weiß nicht, wo der Top-Layout-Guide ist, also topLayoutGuide.length ist 0. Erst nach Abschluss der Animation erhält der View-Controller einen positiven Wert für topLayoutGuide.length. Ja, der Page-View-Controller sollte etwas schlauer sein, aber nicht.
Sie können entweder die Verwendung der oberen Layout-Anleitung beenden und eine automatische Layout-Einschränkung relativ zum oberen Rand der Superansicht vornehmen. Oder Sie können weiterhin die Top-Layout-Anleitung verwenden, aber berücksichtigen Sie, wenn es length ist 0 ist. Sie können dies tun, indem Sie einen Ausgang für das Storyboard des NSLayoutConstraint und überwiegenden viewWillLayoutSubviews() in Ihrem ViewController mit Ihrem UIImageView s machen:

@IBOutlet weak var topSpaceToTLG: NSLayoutConstraint! 
var parentTLGlength: CGFloat = 20 

override func viewWillLayoutSubviews() { 
    if self.topLayoutGuide.length == 0 { 
     // Lengthen the autolayout constraint to where we know the 
     // top layout guide will be when the transition completes 
     topSpaceToTLG.constant = parentTLGlength 
    } else { 
     topSpaceToTLG.constant = 0 
    } 
} 

Dies wird die Spitze Ihrer UIImageView am oberen Layout Führung immer gesagt, dass die Statusleiste unter der Annahme, ist immer 20 Punkte. Vor dem Auslegen von Untersichten wird überprüft, ob die Führungslänge des oberen Layouts 0 ist oder nicht, und Ihre Autonayout-Einschränkung wird entsprechend angepasst. Nachdem die Übergangsanimation abgeschlossen ist, wird das Layout erneut ausgelöst, und die obere Führungslänge des Layers entspricht dem erwarteten Wert, sodass die Constraint-Konstante wieder auf 0 zurückgehen kann. Noch besser als das Festcodieren des Werts ist das Übergeben der exakten Länge des übergeordneten Ansichtscontrollers während der Initialisierung, wobei alle möglichen Änderungen am Top-Layout-Guide wie das Hinzufügen einer Navigationsleiste berücksichtigt werden.

+1

Hat jemand anderes dieses Problem? Das hat nicht für mich funktioniert. Ich habe einen Vollbild-View im Hintergrund und es tut es immer noch. –

+0

Dies berücksichtigt leider nicht die Rotation: In Querformat auf einem Telefon ist die Länge des oberen Layout-Guides _properly_ 0. Das Finden der Führungslänge des übergeordneten VC scheint die einzige Lösung zu sein, eklig wie es ist. –

1

Aus dem Video denke ich, dass Sie dies lösen könnten, indem Sie verhindern, dass der UIPageViewController sich unter den oberen Balken erstreckt.

In xcode können Sie dies mithilfe des Attributinspektors für den Seitenaufruf-Controller tun, indem Sie die Option Kanten unter den oberen Balken verlängern deaktivieren.

Dies sollte verhindern, dass es unter der Statusleiste einblättert, ich denke, helfen, den Schalter zu vermeiden, den Sie sehen.

+0

Ich habe das selbst versucht, aber es hat nicht funktioniert. – jason328

1

Ich stellte fest mein Problem war, dass, als der View-Controller zu animieren anfing die oberen und unteren Layout Guides keine Höhe hatten. Die rechten und linken Ränder haben auch nicht. Wenn die Ansicht fertig animiert wurde, erhielten sie alle eine Höhe oder Breite und meine Ansicht wurde in der Größe angepasst. Ich habe dieses Problem in meinem Projekt behoben, indem ich vertikale Beschränkungen zwischen meinen Objekten und ihrer Super-Ansicht anstelle des Top/Bottom-Layout-Leitfadens hinzugefügt habe. Ich musste auch meine horizontalen Beschränkungen ändern, um die Seitenränder zu ignorieren.

Das letzte Problem, das ich fand, ist, dass ich die Statusleiste selbst erklären musste. Es kann sein oder nicht, oder es könnte eine doppelte Leiste sein, wie wenn Sie Maps verwenden.

Verwandte Themen