web-dev-qa-db-de.com

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

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 unterhalb von statusbar und der Navigationsleiste angezeigt. Die tableview wird unterhalb der Suchleiste angezeigt

Wenn ich dies jedoch mit Xcode 5 sdk iOS 7 starte, 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 7 stabiler Freigabe behoben?

Oder ist es das Problem meiner Codierung?

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

Ich habe vor kurzem Xcode 5 DP heruntergeladen, um meine Apps in iOS 7 zu testen. Als Erstes habe ich festgestellt und bestätigt, dass die Grenzen meiner Ansicht nicht immer auf die Statusleiste und die Navigationsleiste angepasst werden.

In viewDidLayoutSubviews drucke ich die Grenzen der Ansicht:

{{0, 0}, {320, 568}}

Dies führt dazu, dass mein Inhalt unterhalb der Navigationsleiste und der Statusleiste angezeigt wird.

Ich weiß, dass ich die Höhe selbst berechnen kann, indem ich die Höhe des Hauptbildschirms errechnet und die Höhe der Statusleiste und die Höhe der Navigationsleiste abgezogen habe. Dies scheint jedoch unnötige zusätzliche Arbeit zu sein.

Hat jemand anderes dieses Problem erlebt?

UPDATE:

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 gerahmt wird.

Ich habe jedoch keinen Fix für den Fall gefunden, wenn die Navigationsleiste durchsichtig sein soll. Wenn Sie beispielsweise ein Foto im Vollbildmodus anzeigen, möchte ich, dass die Navigationsleiste durchscheinend ist und die Ansicht darunter gerahmt wird. Das funktioniert zwar, aber wenn ich die Navigationsleiste ein-/ausblenden, habe ich sogar noch merkwürdigere Ergebnisse erhalten. Die erste Unteransicht (a UIScrollView) wird jedes Mal von Y Origin geändert.

111
user2110287

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 Ihren View-Controller, und Sie sollten gut damit umgehen können! Der Platz, den Ihre Navigationsleiste beansprucht, sollte automatisch berücksichtigt werden 

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

Sie müssen das obige in Ihre -(void)viewDidLoad-Methode einfügen.

Hinweis: Sie sollten jetzt die neueste Version GM von iOS 7 und Xcode 5 verwenden, da sich die API von den Betaversionen geändert hat.

188
One Man Crew

Screenshot from storyboard

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

Dadurch werden auch die Ausrichtungslinien wie bei iOS 6 festgelegt.

Ein weiteres großartiges Werkzeug in xCode 5 ist "Vorschau": Klicken Sie auf den Butler-Button (Assistent-Editor) 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: Die Deaktivierung von "Kanten verlängern" kann zu einem schwarzen Leuchten in der Navigationsleiste führen, wenn die App unter iOS7 in den Hintergrund wechselt. Das Glühen wird auch in der Multitasking-Ansicht sichtbar (Doppelklicken auf die Home-Taste). Sie können dies beheben, indem Sie die Hintergrundfarbe der Balkenansicht der Navigation auf Weiß setzen.

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

Wie das OP sagt, gibt es dafür eine einfache Lösung, die Navigationsleiste undurchsichtig zu machen. Deaktivieren Sie einfach nicht "Transluzent" für Ihre Navigationsleiste:

enter image description here

12
Bids

self.edgesForExtendedLayout=UIRectEdgeNone;

Es funktioniert auf dem Simulator für iOS 7 (Xcode 5 DP5)

8
yhlin

diese Antworten waren alle hilfreich, vor allem bei MQoder, aber für mich musste ich auch die Standardoberleiste auf "undurchsichtige schwarze Navigation" setzen. 

enter image description here

2
jasonpurdy

@ One Man Crew's Antwort 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
1
Yossi

Wenn Sie die Transparenz beibehalten möchten, wenn der Benutzer Ihre Tabellenansicht durchläuft, können Sie dessen contentInset festlegen:

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

self.edgesForExtendedLayout = UIRectEdgeNone;

Und Sie müssen dies auf 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
EIMEI