Wie kann verhindert werden, dass UINavigationBar in iOS 7 die Ansicht von oben abdeckt?


99

Nach dem Update auf Xcode 5 haben sich die Navigationsleisten in allen Ansichten meiner App nach unten verschoben. Hier sind einige Screenshots, von denen der erste alles in der Ansicht zeigt, während es heruntergezogen wird, und der zweite alles unberührt zeigt. Die Suchleiste sollte dort beginnen, wo sich die Navigationsleiste befindet.

Alle Inhalte Alle Inhalte im Leerlauf

Weiß jemand, wie ich das beheben kann?

bearbeiten: ich habe diese vorherige Empfehlung ausprobiert:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

Aber es liefert sehr merkwürdige Ergebnisse.

Lösungsversuch

Dies kann daran liegen, dass ich unter diesem Ansichts-Controller ein "Folienmenü" habe, das aufgrund der Transparenz der Navigationsleiste angezeigt wird.


Hier sind Sie eine andere Lösung für dieses Problem. stackoverflow.com/a/51491645/10148333
Afonso

Antworten:


234

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.

Wenn Sie die Navigationsleiste ein- und ausblenden müssen, verwenden Sie

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

in Ihrer viewDidLoadMethode.


1
Ich habe dies unter gestellt, viewDidLoadaber es gibt keine Änderungen.
Sam D20

13
machen Sie es in viewDidLayoutSubviews Funktionen
Hindu

1
Das Anhängen an viewDidLayoutSubviews hat den Trick gemacht. Ich schätze die Hilfe, meine Herren!
Sam D20

Hallo, noch Fragen? oder ist es ein Kompliment?
Hindu

1
self.edgesForExtendedLayout = UIRectEdgeNone; half mir
luky

32

In iOS 7durch Standardwerte all Wert - Controller durchscheinend Eigenschaft JA ist , so dass Sie durchscheinend Eigenschaft NO für dieses Problem.

self.navController.navigationBar.translucent = NO;

2
Es gibt keine "navController" -Eigenschaft. Verwenden Sie dies: self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan

Ich erstelle ein navigtionbarcontroller-Objekt im App-Delegaten und gebe den Namen navController.
Sumit Mundra

21

Sie können die Option "Kanten erweitern" im Attributinspektor des View Controllers dieses Bildschirms deaktivieren (siehe Abbildung unten):

Geben Sie hier die Bildbeschreibung ein


12

Dies funktioniert auch unter iOS 8.1 für Swift

navigationController?.navigationBar.translucent = false

8

Wenn Sie die Transluzenz beibehalten möchten, fügen Sie navigationBaram Ende Ihres viewDidLoadoder in Ihrem viewWillAppearCode diese Codezeile hinzu:

[self.view sendSubviewToBack:self.tableView]

Wenn Ihre scrollViewUnterklasse ( UITableView, UICollectionViewusw.) indexin Ihrer aktuellen Ansicht auf 0 steht subviews, werden die Einfügungen automatisch an Ihre angepasst navigationBar. Und es sollte auch in Versionen vor iOS7 keine Auswirkungen auf Ihre Benutzeroberfläche haben.


BEARBEITEN Wenn Sie Ihr UITableViewProgramm programmgesteuert initialisieren , fügen Sie es am besten der Ansicht hinzu[self.view insertSubview:self.tableView atIndex:0];


Dies sollte die richtige Antwort sein. Wenn Sie die Unteransicht programmgesteuert hinzufügen, können Sie dies einfach tun, [self.view insertSubview:self.tableView atIndex:0];anstatt sie nach dem Hinzufügen nach hinten zu senden.
smitt04

Richtig. Ohne zu wissen, wie er seinen Controller initiiert (programmgesteuert, Interface Builder), können wir nicht davon ausgehen, dass dies die beste Lösung ist. Obwohl ich meine Antwort bearbeitet habe.
Jbouaziz

Das funktioniert aber sieht aus wie ein Hack. Gibt es in der offiziellen Dokumentation einen Hinweis dazu?
John Tracid

4

Swift 4 :

Legen Sie die folgende Codezeile in der viewDidLoad-Methode fest:

self.navigationController?.navigationBar.isTranslucent = false

3

Sie können diese Methode wie unter dieser URL gezeigt zu Ihrem View Controller hinzufügen :

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

2

Ein anderer Ansatz besteht darin, self.automaticallyAdjustsScrollViewInsets = YES;auf Ihrem View Controller festzulegen. Dies ist standardmäßig aktiviert. Aber in deinem Fall:

Ich sehe, dass Sie EGORefreshHeaderView verwenden. Es spielt mit contentInset von UITableView. Wenn Sie es freigeben, setzt der Header den oberen Einschub zurück, anstatt den vorherigen Wert wiederherzustellen.


-1

Wenn Sie die vollständige Kontrolle über Ansichten haben und fehlerhafte Anpassungen von iOS vermeiden möchten, unterordnen Sie UITableView und passen Sie die Einfügungen (sowohl Bildlauf als auch Anzeigen) in - (void) willMoveToWindow: (UIWindow *) newWindow an. Funktioniert bei mir.


-4

Eine andere Möglichkeit besteht darin, Ihre Info.plist-Datei im Quellcodemodus zu öffnen und die folgenden Informationen einzugeben:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>

Hoffe das hilft.


1
Ich glaube nicht, dass dies die Sicht beeinträchtigen würde.
Enrico Susatyo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.