Ich habe viel über den Übergang der iOS7-Benutzeroberfläche gelesen.
Ich bin nicht in der Lage , was diese drei Eigenschaften zu erhalten automaticallyAdjustsScrollViewInsets
, extendedLayoutIncludesOpaqueBars
, edgesForExtendedLayout
??
Ich versuche beispielsweise, meine View Controller unterhalb der Statusleiste zu starten, kann dies jedoch nicht erreichen.
ios
objective-c
xcode
uiviewcontroller
ios7
user1010819
quelle
quelle
Antworten:
Ab iOS7 verwenden die View Controller standardmäßig das Vollbild-Layout. Gleichzeitig haben Sie mehr Kontrolle darüber, wie die Ansichten dargestellt werden. Dies geschieht mit den folgenden Eigenschaften:
KantenForExtendedLayout
Grundsätzlich legen Sie mit dieser Eigenschaft fest, welche Seiten Ihrer Ansicht auf den gesamten Bildschirm erweitert werden können. Stellen Sie sich vor, Sie drücken ein
UIViewController
in einUINavigationController
. Wenn die Ansicht dieses Ansichtscontrollers angelegt ist, beginnt sie dort, wo die Navigationsleiste endet. Mit dieser Eigenschaft wird jedoch festgelegt, welche Seiten der Ansicht (oben, links, unten, rechts) erweitert werden können, um den gesamten Bildschirm auszufüllen.Lassen Sie es uns anhand eines Beispiels sehen:
Hier legen Sie nicht den Wert von fest
edgesForExtendedLayout
, daher wird der Standardwert (UIRectEdgeAll
) verwendet, sodass die Ansicht ihr Layout erweitert, um den gesamten Bildschirm auszufüllen.Das ist das Ergebnis:
Wie Sie sehen können, erstreckt sich der rote Hintergrund hinter der Navigationsleiste und der Statusleiste.
Jetzt setzen Sie diesen Wert auf
UIRectEdgeNone
und weisen den Ansichts-Controller an, die Ansicht nicht auf den Bildschirm auszudehnen:Und das Ergebnis:
autoAdjustsScrollViewInsets
Diese Eigenschaft wird verwendet, wenn Ihre Ansicht
UIScrollView
ähnlich oder ähnlich ist, zUITableView
. Sie möchten, dass Ihre Tabelle dort beginnt, wo die Navigationsleiste endet, da sonst nicht der gesamte Inhalt angezeigt wird. Gleichzeitig soll Ihre Tabelle beim Scrollen den gesamten Bildschirm abdecken. In diesem FalledgesForExtendedLayout
funktioniert die Einstellung " Keine" nicht, da Ihre Tabelle an der Stelle, an der die Navigationsleiste endet, einen Bildlauf durchführt und nicht dahinter steht.Hier ist diese Eigenschaft nützlich. Wenn Sie den Ansichts-Controller die Einfügungen automatisch anpassen lassen (indem Sie diese Eigenschaft auf JA setzen, auch den Standardwert), werden am oberen Rand der Tabelle Einfügungen hinzugefügt, sodass die Tabelle dort beginnt, wo die Navigation beginnt Die Leiste endet, aber der Bildlauf deckt den gesamten Bildschirm ab.
Dies ist, wenn auf NO gesetzt ist:
Und JA (standardmäßig):
In beiden Fällen wird die Tabelle hinter der Navigationsleiste gescrollt, im zweiten Fall (JA) wird sie unterhalb der Navigationsleiste gestartet.
ExtendedLayoutIncludesOpaqueBars
Dieser Wert ist nur eine Ergänzung zu den vorherigen. Standardmäßig ist dieser Parameter auf NO eingestellt. Wenn die Statusleiste undurchsichtig ist, werden die Ansichten nicht um die Statusleiste erweitert, selbst wenn Sie Ihre Ansicht erweitern, um sie abzudecken (
edgesForExtendedLayout
bisUIRectEdgeAll
).Wenn Sie den Wert auf YES setzen, wird die Ansicht wieder unter die Statusleiste verschoben.
Wenn etwas nicht klar ist, schreibe einen Kommentar und ich werde ihn beantworten.
Woher weiß iOS, welches UIScrollView verwendet werden soll?
iOS greift auf die erste Unteransicht in der Ansicht Ihres ViewControllers zu, die am Index 0, und wenn es sich um eine Unterklasse von handelt
UIScrollView
, werden die erläuterten Eigenschaften darauf angewendet .Dies bedeutet natürlich, dass dies
UITableViewController
standardmäßig funktioniert (da diesUITableView
die erste Ansicht ist).quelle
Sie sind sich nicht sicher, ob Sie Storyboards verwenden, aber wenn ja, damit Ihre View Controller unterhalb der Statusleiste (und oberhalb der unteren Leiste) beginnen:
Wählen Sie den Ansichts-Controller in IB aus. Deaktivieren Sie im Attributinspektor die Option "Kanten erweitern - unter den oberen Balken" und "Kanten erweitern - unter den unteren Balken".
quelle
Ich verwende Storyboards und die oben genannten Ratschläge haben funktioniert, aber ich war mir nicht ganz sicher, wie ich sie implementieren soll. Im Folgenden finden Sie ein kurzes Beispiel, wie das Problem durch Einfügen der empfohlenen Lösung in den ViewController behoben werden kann.
Mein Problem: Die automatische Anpassung ist standardmäßig auf true gesetzt, was zu einem Unterschied zwischen Storyboard-Design und Simulator führt
Behoben: Der oben angegebene Code wurde angewendet und die automatische Anpassung deaktiviert.
quelle
Ich habe dieses Problem durch Hinzufügen dieser Zeile gelöst, aber mein Problem bezog sich auf a
UIView
, nichtUIScrollView
quelle
Denken Sie
automaticallyAdjustsScrollViewInsets
nur daran, dass die Eigenschaft nur funktioniert, wenn eine Bildlaufansicht (Tabellenansicht, Sammlungsansicht, ...) vorhanden istAndere schlugen vor, dass es auch dann funktioniert, wenn es sich um die erste Unteransicht handelt, aber es gibt andere Bildlaufansichten in der Ansichtshierarchie.
EDIT (Erweiterung DIY)
Wenn Sie ein ähnliches Verhalten wünschen, auch wenn Sie diese Bedingungen nicht erfüllen können (z. B. wenn Sie ein Hintergrundbild unter der Bildlaufansicht haben), können Sie die Bildlaufansichten manuell anpassen. Aber bitte setzen Sie es nicht auf konstant wie 44 oder 64 oder sogar 20, wie viele um SO vorschlagen. Sie können die Größe nie kennen. Es kann eine Incall / GPS / Audio-Benachrichtigung geben, die Navigationsleiste muss nicht immer 44 Punkte usw. enthalten.
Ich denke, die beste Lösung ist die Verwendung von layoutGuide
length
in didLayoutSubviews:Sie können den bottomLayoutGuide auf die gleiche Weise verwenden.
quelle