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.

Sam D20
quelle
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.

Deepesh
quelle
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;
Sumit Mundra
quelle
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

Achyut Sagar
quelle
12

Dies funktioniert auch unter iOS 8.1 für Swift

navigationController?.navigationBar.translucent = false
uplearnedu.com
quelle
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];

jbouaziz
quelle
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
Md. Najmul Hasan
quelle
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);
}
malkoty
quelle
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.

Krivoblotsky
quelle
-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.

Farhad Malekpour
quelle
-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.

Nicoli
quelle
1
Ich glaube nicht, dass dies die Sicht beeinträchtigen würde.
Enrico Susatyo