Pasek nawigacji pojawia się nad widokami z nowym pakietem SDK dla systemu iOS7

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];

We wcześniejszych wersjach działa poprawnie. Pasek wyszukiwania pojawia się poniżej statusbarpaska nawigacji i. Pojawia tableviewsię poniżej paska wyszukiwania

Ale kiedy to uruchomię Xcode 5 sdk iOS 7, pasek wyszukiwania nie jest widoczny (myślę, że jest umieszczony pod paskiem stanu i paskiem nawigacji), a także pasek nawigacji pojawia się nad widokiem tabeli.

Czy zostanie to naprawione w iOS 7wersji stabilnej?

Czy jest to problem z moim kodowaniem?

A może powinniśmy to zrobić, dodając (y = statubar height + nav bar height)wartość y dla iOS 7?

Niedawno pobrałem Xcode 5 DP, aby przetestować swoje aplikacje w iOS 7. Pierwszą rzeczą, jaką zauważyłem i potwierdziłem, jest to, że granice mojego widoku nie zawsze są zmieniane w celu uwzględnienia paska stanu i paska nawigacji.

W viewDidLayoutSubviews, drukuję granice widoku:

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

Powoduje to, że moja zawartość pojawia się poniżej paska nawigacji i paska stanu.

Wiem, że sam mógłbym uwzględnić wysokość, uzyskując wysokość głównego ekranu, odejmując wysokość paska stanu i wysokość paska nawigacji, ale wydaje się to niepotrzebną dodatkową pracą.

Czy ktoś jeszcze doświadczył tego problemu?

AKTUALIZACJA:

Znalazłem rozwiązanie tego konkretnego problemu. Ustaw przezroczystą właściwość paska nawigacji na NIE:

self.navigationController.navigationBar.translucent = NO;

Spowoduje to usunięcie ramki widoku pod paskiem nawigacji i paskiem stanu.

Jednak nie znalazłem rozwiązania dla przypadku, gdy chcesz, aby pasek nawigacji był półprzezroczysty. Na przykład, przeglądając zdjęcie na pełnym ekranie, chciałbym, aby pasek nawigacji był półprzezroczysty, a widok znajdował się pod nim. To działa, ale kiedy przełączam wyświetlanie / ukrywanie paska nawigacyjnego, doświadczyłem jeszcze dziwniejszych wyników. Pierwszy widok podrzędny (a UIScrollView) zmienia swoje granice y pochodzenia za każdym razem.


źródło
4
Oprogramowanie w wersji beta. Fora programistów Apple są bardziej odpowiednie. Ponadto problem jest wyraźnie opisany w przewodniku przejścia.
Sulthan

Odpowiedzi:

188

To nie do końca prawda. W iOS 7 wprowadzono nową właściwość, która pozwala dostosować zachowanie układu, tak jak w poprzednich wersjach iOS. Umieść ten fragment kodu w kontrolerze widoku i powinieneś być gotowy! Miejsce zajmowane przez pasek nawigacji powinno być uwzględniane automatycznie

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

Musisz dodać powyższe w swojej -(void)viewDidLoadmetodzie.

Uwaga: powinieneś używać najnowszej wersji GM iOS 7 i Xcode 5, ponieważ API zmieniło się z wersji beta.

Załoga One Man
źródło
w moim kodzie jest napisane edgeForExtendedLayout. Użycie niezadeklarowanego identyfikatora UIExtendedEdgeNone. Proszę pomóż.
6
Zostało zmienione na UIRectEdgeNone
Simon
6
Właśnie z tego powodu nie powinno się tutaj zadawać takiego pytania ani odpowiadać na nie.
Sulthan
Nie rozumiem, dlaczego chcąc zachować kompatybilność z ios6, zmuszony jesteś wprowadzić warunkowy przypadek po kodzie, aby sprawdzić, czy kontroler ma tę właściwość, czy nie ..
jerrygdm
12
Wydaje się, że działa to tylko wtedy, gdy widok jest osadzony w UINavigationController.
pojo
37

Zrzut ekranu z serii ujęć

Jeśli pracujesz w Storyboard (co zdecydowanie polecam!), To jest rozwiązanie: Możesz wyłączyć "Rozszerz krawędzie" swojego ViewController w scenorysie. Musisz to zrobić dla każdego viewController. Możesz wyłączyć rozszerzone krawędzie, klikając ikonę viewController na tablicy stortyboard (poza właścicielem produktu pod samym widokiem), a następnie wybierając inspektor atrybutów (tak jak pokazuje obrazy).

Spowoduje to również ustawienie linii wyrównania, takich jak iOS 6.

Kolejnym świetnym narzędziem w xCode 5 jest „Podgląd”: kliknij przycisk lokaja (asystent edytora) i wybierz Podgląd. tam możesz wybrać iOS 6 i zobaczyć, jak będzie wyglądał Twój projekt scenorysu na iOS 6.

Po prostu świetnie: D

[Aktualizacja]

Uważaj: wyłączenie opcji „Rozszerz krawędzie” może spowodować wyświetlenie czarnej poświaty na pasku nawigacji, gdy aplikacja przejdzie w tło w systemie iOS7. blask będzie również widoczny w widoku wielozadaniowym (dwukrotne naciśnięcie przycisku home). można to rozwiązać, ustawiając kolor tła paska nawigacji na biały.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];
MQoder
źródło
Tak, to jest rozwiązanie z perspektywy scenorysu. Dziękuję Ci.
jpittman,
12

Jak mówi OP, istnieje proste rozwiązanie tego problemu, które polega na ustawieniu paska nawigacji tak, aby był nieprzezroczysty. Zamiast robić to w kodzie, po prostu odznacz „Półprzezroczysty” na głównym pasku nawigacji:

wprowadź opis obrazu tutaj

Oferty
źródło
8

self.edgesForExtendedLayout=UIRectEdgeNone;

Działa na symulatorze iOS 7 (Xcode 5 DP5)

yhlin
źródło
2
działa to dobrze w ios7, ale jeśli uruchomiłem aplikację na iOS 6 i wcześniej, widoki są przesunięte w górę. Jakieś rozwiązanie na to? Musimy również ustawić tę właściwość w każdej metodzie ładowania kontrolera widoku viewdid?
loganathan,
zawsze możesz sprawdzić, czy aktualny iOS to 7, jeśli:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel Gross
2

wszystkie te odpowiedzi były pomocne, zwłaszcza MQoder, ale dla mnie musiałem również ustawić domyślny górny pasek na „nieprzejrzystą czarną nawigację”.

wprowadź opis obrazu tutaj

jasonpurdy
źródło
1

Odpowiedź @One Man Crew jest poprawna, ale:

Zalecałbym użycie tego kodu, aby uniknąć błędów podczas uruchamiania aplikacji na starszych wersjach:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif
Yossi
źródło
0

self.edgesForExtendedLayout = UIRectEdgeNone;

I musisz to zrobić w AppDelegate # application: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

W przeciwnym razie kolor tła paska nawigacji zmieni się na szary. Ponieważ przezroczysty pasek nawigacji zachodzi na okno.

EIMEI
źródło
0

Jeśli chcesz zachować przezroczystość, gdy użytkownik przewija widok tabeli, możesz ustawić jej zawartość:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);
Enrico Susatyo
źródło
-1

Jednym z rozwiązań jest użycie kontrolera nawigacji. To automatycznie rozwiązuje problem. Używaj także Xcode 5 zamiast wersji Xcode Preview, ponieważ są to wersje beta.

Jayprakash Dubey
źródło