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 statusbar
paska nawigacji i. Pojawia tableview
się 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 7
wersji 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.
Odpowiedzi:
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
Musisz dodać powyższe w swojej
-(void)viewDidLoad
metodzie.Uwaga: powinieneś używać najnowszej wersji GM iOS 7 i Xcode 5, ponieważ API zmieniło się z wersji beta.
źródło
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.
źródło
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:
źródło
self.edgesForExtendedLayout=UIRectEdgeNone;
Działa na symulatorze iOS 7 (Xcode 5 DP5)
źródło
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
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ę”.
źródło
Odpowiedź @One Man Crew jest poprawna, ale:
Zalecałbym użycie tego kodu, aby uniknąć błędów podczas uruchamiania aplikacji na starszych wersjach:
źródło
I musisz to zrobić w AppDelegate # application: didFinishLaunchingWithOptions:
W przeciwnym razie kolor tła paska nawigacji zmieni się na szary. Ponieważ przezroczysty pasek nawigacji zachodzi na okno.
źródło
Jeśli chcesz zachować przezroczystość, gdy użytkownik przewija widok tabeli, możesz ustawić jej zawartość:
źródło
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.
źródło