Die Navigationsleiste wird mit dem neuen iOS7 SDK über den Ansichten angezeigt


113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

In den früheren Versionen funktioniert es korrekt. Die Suchleiste wird unter der statusbarNavigationsleiste und angezeigt. Das tableviewwird unter der Suchleiste angezeigt

Aber wenn ich dies ausführe Xcode 5 sdk iOS 7, ist die Suchleiste nicht sichtbar (ich denke, sie befindet sich unter der Statusleiste und der Navigationsleiste), und auch die Navigationsleiste wird über der Tabellenansicht angezeigt.

Wird es mit iOS 7stabiler Freigabe behoben ?

Oder ist es das Problem meiner Codierung?

Oder sollten wir damit umgehen, indem wir den y- (y = statubar height + nav bar height)Wert für addieren iOS 7?

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.

Hat jemand anderes dieses Problem erlebt?

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 das Ein- und Ausblenden der Navigationsleiste umschalte, habe ich noch seltsamere Ergebnisse erzielt. Die Grenzen der ersten Unteransicht (a UIScrollView) werden jedes Mal geändert.


4
Beta-Software. Apple-Entwicklerforen sind angemessener. Das Problem wird auch in der Übergangsanleitung ausdrücklich erwähnt.
Sulthan

Antworten:


188

Das stimmt nicht ganz. In iOS 7 wurde eine neue Eigenschaft eingeführt, mit der Sie das Layoutverhalten wie in früheren Versionen von iOS anpassen können. Platzieren Sie diesen Code in Ihrem View Controller, und Sie sollten bereit sein! Der Platz, den Ihre Navigationsleiste einnimmt, sollte automatisch berücksichtigt werden

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

Sie müssen das oben Genannte in Ihre -(void)viewDidLoadMethode aufnehmen.

Hinweis: Sie sollten jetzt die neueste GM-Version von iOS 7 und Xcode 5 verwenden, da die API von den Beta-Versionen geändert wurde.


In meinem Code steht KantenForExtendedLayout. Verwendung des nicht deklarierten Bezeichners UIExtendedEdgeNone. Bitte helfen Sie.

6
Es wurde in UIRectEdgeNone
Simon

6
Genau aus diesem Grund sollte eine solche Frage hier nicht gestellt oder beantwortet werden.
Sulthan

Ich verstehe nicht, warum, wenn Sie die Kompatibilität mit ios6 beibehalten möchten, Sie gezwungen sind, einen bedingten Fall per Code einzuführen, um zu überprüfen, ob der Controller diese Eigenschaft hat oder nicht ..
jerrygdm

12
Dies scheint nur zu funktionieren, wenn die Ansicht in einen UINavigationController eingebettet ist.
Pojo

37

Screenshot vom Storyboard

Wenn Sie in Storyboard arbeiten (was ich dringend empfehle!), Ist dies die Lösung: Sie können "Kanten erweitern" Ihres ViewControllers im Storyboard deaktivieren. Sie müssen dies für jeden viewController tun. Sie können erweiterte Kanten deaktivieren, indem Sie im Stortyboard auf das viewController-Symbol klicken (neben dem productOwner unter der Ansicht selbst) und dann den Attributinspektor auswählen (wie die Bilder zeigen).

Dadurch werden auch die Ausrichtungslinien wie in iOS 6 festgelegt.

Ein weiteres großartiges Tool in xCode 5 ist "Vorschau": Klicken Sie auf die Butler-Schaltfläche (Editor-Assistent) und wählen Sie Vorschau. Dort können Sie iOS 6 auswählen und sehen, wie Ihr Storyboard-Design unter iOS 6 aussehen wird.

Es ist einfach toll: D.

[Aktualisieren]

Seien Sie vorsichtig: Wenn Sie "Kanten verlängern" deaktivieren, leuchtet die Navigationsleiste möglicherweise schwarz, wenn die App unter iOS7 in den Hintergrund wechselt. Das Leuchten ist auch in der Multitasking-Ansicht sichtbar (zweimaliges Drücken der Home-Taste). Dies kann gelöst werden, indem die Hintergrundfarbe der Navigationsleistenansicht auf Weiß gesetzt wird.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];

Ja, dies ist die Lösung aus der Storyboard-Perspektive. Danke dir.
Jpittman

12

Wie das OP sagt, gibt es eine einfache Lösung dafür, die Navigationsleiste so einzustellen, dass sie undurchsichtig ist. Deaktivieren Sie einfach "Translucent" für Ihre Root-Navigationsleiste, anstatt dies im Code zu tun:

Geben Sie hier die Bildbeschreibung ein


8

self.edgesForExtendedLayout=UIRectEdgeNone;

Es funktioniert auf iOS 7 Simulator (Xcode 5 DP5)


2
Dies funktioniert gut in iOS 7, aber wenn ich die App auf iOS 6 und früher wieder ausgeführt habe, werden die Ansichten nach oben verschoben. Irgendeine Lösung dafür?. Außerdem müssen wir diese Eigenschaft in jeder Ansichts-Controller-Ansichtsdid-Lademethode festlegen.
Loganathan

Sie können immer überprüfen, ob das aktuelle iOS 7 ist, wenn:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel Gross

2

Diese Antworten waren alle hilfreich, insbesondere die von MQoder, aber für mich musste ich auch die Standard-Oberleiste auf "undurchsichtige schwarze Navigation" setzen.

Geben Sie hier die Bildbeschreibung ein


1

Die Antwort von @One Man Crew ist richtig, aber:

Ich würde empfehlen, diesen Code zu verwenden, um Fehler beim Ausführen der App auf älteren Versionen zu vermeiden:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif

0

self.edgesForExtendedLayout = UIRectEdgeNone;

Und Sie müssen dies in der AppDelegate # -Anwendung tun: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

Andernfalls wird die Hintergrundfarbe der Navigationsleiste in Grau geändert. Weil die transparente Navigationsleiste das Fenster überlappt.


0

Wenn Sie die Transparenz beim Scrollen der Tabellenansicht durch den Benutzer beibehalten möchten, können Sie das contentInset festlegen:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

-1

Eine Lösung ist die Verwendung von Navigation Controller. Dies löst das Problem automatisch. Verwenden Sie auch Xcode 5 anstelle von Xcode Preview-Versionen, da es sich um Beta-Versionen handelt.

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.