web-dev-qa-db-de.com

nach der Ansicht angewendete Autolayout-Einschränkungen für iOS 8/XCode 6

Ich habe ein Projekt, das mit XCode 5 und iOS 7 einwandfrei funktioniert, aber als ich kürzlich XCode 6 heruntergeladen habe, habe ich ein seltsames Verhalten mit Autolayout festgestellt.

Ich habe ein Storyboard mit einer Ansicht, die nur eine UIImageView und zwei UILabels hat. Diese Ansicht wird mit einem UiPageViewController geladen. Die UIImageView ist in der Ansicht horizontal und vertikal zentriert. Es gibt Einschränkungen, die den Abstand der beiden Beschriftungen von der Bildansicht festlegen. Wenn es einen Fall gibt, in dem die Werte für Storyboard und Autolayout in Konflikt stehen (z. B. befindet sich im Storyboard ein Bild 20 Pixel über der Bildansicht, das Autolayout sagt jedoch, dass es 40 Pixel darüber sein sollte), war der Autolayout-Wert normalerweise der Fall erfolgreich angewendet, bevor die Ansicht geladen wurde. Wenn also die Ansicht zum ersten Mal gezeigt wird, ist alles am richtigen Ort.

Jetzt mit iOS 8/XCode 6 sehe ich, dass die Ansicht geladen wird und die Dinge dann zu ihrer endgültigen Autolayout-Position springen. Dieser Sprung ist für den Endbenutzer sowohl im Simulator als auch auf einem echten Gerät spürbar und sehr ärgerlich. Gibt es eine Möglichkeit, zum alten Verhalten zurückzukehren? Soweit mir bekannt ist, wurde kein Code geändert, um dieses Problem zu verursachen.

25
wuc

Wo ist Ihr Code, der Änderungen an Ihren Einschränkungen vornimmt?

Wenn Sie es in viewWillAppear: behalten, wird dieses Problem auftreten. Ich fand, dass viewDidLayoutSubviews gut für iOS8 funktioniert, aber nicht immer für iOS7 rückwärts.

Wenn Sie viewDidLayoutSubviews nicht verwenden können, sollten Sie die Containeransicht in viewDidLoad ausblenden und in viewWillAppear einblenden, nachdem die Einschränkungen angewendet wurden. Sie erhalten eine kleine zusätzliche Verzögerung beim Laden des Bildschirms, die Änderungen werden jedoch für den Benutzer transparent.

9
Marcelo Ribeiro

Für mich war es ein Problem mit der Tab-Leiste in meinem Projekt. Ich brauchte es in dieser Ansicht nicht und versteckte es auf Push. Wenn also die Ansicht auf den Stapel verschoben wurde, wurde die Leiste ausgeblendet und die Einschränkungen entsprechend angepasst. Also habe ich einfach die Tab-Leiste wieder eingefügt.

0
dcotter

Ich hatte ein ähnliches Problem und fügte Elemente in eine Containeransicht ein, um mich darauf vorzubereiten, sie auszublenden und sie dann wie in der anderen Antwort vorgeschlagen anzuzeigen.

Ich liebte das nicht als Lösung und musste es auch nicht tun.

Wenn Sie sie einfach in eine Containeransicht stellen, die an die Controller-Ansicht gekoppelt ist, konnte das Problem nicht mehr auftreten.

0
mwright