Ich habe kürzlich Xcode 5 DP heruntergeladen , um meine Apps in iOS 7 zu testen. Als erstes habe ich festgestellt und bestätigt, dass die Größe meiner Ansicht nicht immer geändert wird, um die Statusleiste und die Navigationsleiste zu berücksichtigen.
In viewDidLayoutSubviews
drucke ich die Grenzen der Ansicht:
{{0, 0}, {320, 568}}
Dies führt dazu, dass mein Inhalt unter der Navigationsleiste und der Statusleiste angezeigt wird.
Ich weiß, dass ich die Höhe selbst erklären kann, indem ich die Höhe des Hauptbildschirms erhalte, die Höhe der Statusleiste und die Höhe der Navigationsleiste subtrahiere, aber das scheint unnötige zusätzliche Arbeit zu sein.
Wie kann ich dieses Problem beheben?
Aktualisieren:
Ich habe eine Lösung für dieses spezielle Problem gefunden. Setzen Sie die durchscheinende Eigenschaft der Navigationsleiste auf NO:
self.navigationController.navigationBar.translucent = NO;
Dadurch wird verhindert, dass die Ansicht unter der Navigationsleiste und der Statusleiste eingerahmt wird.
Ich habe jedoch keine Lösung für den Fall gefunden, dass die Navigationsleiste durchscheinend sein soll. Wenn Sie beispielsweise ein Foto im Vollbildmodus anzeigen, möchte ich, dass die Navigationsleiste durchscheinend ist und die Ansicht darunter eingerahmt wird. Das funktioniert, aber wenn ich die Navigationsleiste ein- oder ausblende, habe ich noch seltsamere Ergebnisse erzielt. Bei der ersten Unteransicht (einer UIScrollView) werden die Grenzen und der Ursprung jedes Mal geändert.
Antworten:
Sie können dies erreichen, indem Sie eine neue Eigenschaft implementieren, die
edgesForExtendedLayout
im iOS7 SDK aufgerufen wird. Bitte fügen Sie den folgenden Code hinzu, um dies zu erreichen:Sie müssen das oben Genannte in Ihre
-(void)viewDidLoad
Methode aufnehmen.Bitte beziehen Sie sich auf Apple Doc
quelle
Sie müssen nicht berechnen, wie weit Sie alles nach unten verschieben müssen, dafür gibt es eine eingebaute Eigenschaft. Markieren Sie im Interface Builder Ihren Ansichtscontroller und navigieren Sie zum Attributinspektor. Hier sehen Sie einige Kontrollkästchen neben den Worten "Kanten verlängern". Wie Sie sehen können, wird im ersten Screenshot standardmäßig der Inhalt unter den oberen und unteren Balken angezeigt, jedoch nicht unter den undurchsichtigen Balken. Daher hat es für Sie funktioniert, den Balkenstil auf nicht durchscheinend einzustellen.
Wie Sie im ersten Screenshot sehen können, verstecken sich zwei UI-Elemente unter der Navigationsleiste. (Ich habe Wireframes in IB aktiviert, um dies zu veranschaulichen.) Bei diesen Elementen, einem UIButton und einem UISegmentedControl, ist der Ursprung "y" auf Null gesetzt, und der Ansichts-Controller ist so eingestellt, dass Inhalte unterhalb der oberen Leiste zulässig sind.
Dieser zweite Screenshot zeigt, was passiert, wenn Sie das Kontrollkästchen "Unter den oberen Balken" deaktivieren. Wie Sie sehen können, wurde die Ansicht der Ansichtssteuerung entsprechend nach unten verschoben, damit sich ihr y-Ursprung direkt unter der Navigationsleiste befindet.
Dies kann auch programmgesteuert durch die Verwendung von erreicht werden
-[UIViewController edgesForExtendedLayout]
. Hier ist ein Link zur Klassenreferenz für edgeForExtendedLayout und für UIRectEdgequelle
Ich habe meine Ansicht programmgesteuert erstellt und dies hat für mich funktioniert:
Quelle (im Abschnitt topLayoutGuide unten auf Seite 39).
quelle
topLayoutGuide
ist iOS7 nur.Swift 3 / Swift 4-Lösung, die auch mit NIBs / XIB-Dateien in iOS 10+ funktioniert:
quelle
Wenn die Ansicht die durchscheinende Navigationsleiste haben soll (was irgendwie nett ist), müssen Sie ein contentInset oder ähnliches einrichten.
So mache ich das:
quelle
contentInset
ist eine Eigenschaft vonUIScrollView
. Was passiert , wenn meine Hauptansicht ist keine Unterklasse vonUIScrollView
. Wie würde ich dann das Überlappungsproblem beheben?edgesForExtendedLayout
macht den Trick für iOS 7. Wenn Sie die App jedoch über das iOS 7 SDK erstellen und in iOS 6 bereitstellen, wird die Navigationsleiste durchscheinend und die Ansichten darunter angezeigt. Gehen Sie folgendermaßen vor, um das Problem sowohl für iOS 7 als auch für iOS 6 zu beheben:quelle
Fügen Sie in der Plist-Datei Ihrer Apps eine Zeile hinzu, nennen Sie sie "Controller-basiertes Erscheinungsbild der Statusleiste anzeigen" und setzen Sie sie auf NO .
quelle
Der einfachste Trick besteht darin, die NIB- Datei zu öffnen und diese beiden einfachen Schritte auszuführen:
Und das Ergebnis :
quelle
Schnelle Lösung:
quelle
super.viewWillAppear(animated)
Ich möchte Stunners Antwort erweitern und eine hinzufügen
if
Erklärung zu überprüfen, ob es sich um iOS-7 handelt, da meine App beim Testen unter iOS 6 abstürzen würde.Der Zusatz würde hinzufügen:
Daher würde ich vorschlagen, diese Methode zu Ihrer
MyViewControler.m
Datei hinzuzufügen :quelle
Swift 3
quelle
Ich habe ein Szenario, in dem ich den von Apple geschriebenen BannerViewController zum Anzeigen meiner Anzeigen und einen in den BannerViewController eingebetteten ScrollViewController verwende.
Um zu verhindern, dass die Navigationsleiste meinen Inhalt verbirgt, musste ich zwei Änderungen vornehmen.
1) Ändern Sie BannerViewController.m
2) Ändern Sie meinen ScrollViewContoller
Jetzt werden die Anzeigen am unteren Rand der Ansicht korrekt angezeigt, anstatt von der Navigationsleiste abgedeckt zu werden, und der Inhalt oben wird nicht abgeschnitten.
quelle
Stellen Sie einfach den folgenden Code in der Ansicht ein.
quelle
Machen Sie eine Einschränkung für das Top-Layout wie folgt
quelle
Swift 4.2 - Xcode 10.0 - iOS 12.0:
quelle
Für mich besteht die einfachste Lösung darin, zwei Schlüssel in die Liste aufzunehmen
quelle
Fügen Sie den Schlüssel "View Controller-basiertes Erscheinungsbild der Statusleiste" aus der Dropdown-Liste als Zeile in hinzu
info.plist
. Etwas wie das:quelle
Ich hatte das gleiche Problem mit meiner App von iPads (armv7, armv7s, amr64), nur indem ich einen anderen UIViewController präsentierte und nach dessen Entlassung die Navigationsleiste unter der Statusleiste angezeigt wird ... Ich verbringe viel Zeit damit, eine Lösung dafür zu finden. Ich verwende Storyboard und in InterfaceBuilder für UIViewController, was schrecklich macht. Ich habe Presentation from FullScreen -> Current Context eingestellt und dieses Problem behoben. Es funktioniert in meiner App nur für iPads => iOS8.0 (Testen mit iOS8.1) und für iPads mit iOS 7.1 funktioniert es nicht !!
quelle
Schritte zum Ausblenden der Statusleiste in iOS 7:
1.Gehen Sie zu Ihrer Anwendungsinfo.plist-Datei.
2.Und Set, View Controller-basiertes Statusleisten-Erscheinungsbild: Boolean NO
Hoffe, ich habe das Problem mit der Statusleiste gelöst .....
quelle
In meinem Fall wurde loadView () unterbrochen
diesen Code : self.edgesForExtendedLayout = UIRectEdgeNone
aber nach dem Löschen von loadView () hat alles gut funktioniert
quelle