Niedawno pobrałem Xcode 5 DP, aby przetestować moje aplikacje w iOS 7. Pierwszą rzeczą, którą zauważyłem i potwierdziłem, jest to, że granice mojego widoku nie zawsze są zmieniane, aby uwzględnić pasek stanu i pasek nawigacji.
W viewDidLayoutSubviews
drukuję granice widoku:
{{0, 0}, {320, 568}}
Powoduje to, że moja treść pojawia się poniżej paska nawigacyjnego i paska stanu.
Wiem, że mógłbym samodzielnie wyliczyć wysokość, uzyskując wysokość ekranu głównego, odejmując wysokość paska stanu i wysokość paska nawigacji, ale wydaje się to niepotrzebną dodatkową pracą.
Jak mogę rozwiązać ten problem?
Aktualizacja:
Znalazłem rozwiązanie tego konkretnego problemu. Ustaw półprzezroczystą właściwość paska nawigacji na NIE:
self.navigationController.navigationBar.translucent = NO;
Naprawi to kadrowanie widoku pod paskiem nawigacyjnym i paskiem stanu.
Jednak nie znalazłem rozwiązania dla przypadku, gdy chcesz, aby pasek nawigacji był półprzezroczysty. Na przykład, oglądając zdjęcie na pełnym ekranie, chciałbym, aby pasek nawigacji był przezroczysty, a widok, który ma być w nim obramowany. To działa, ale kiedy przełączam wyświetlanie / ukrywanie paska nawigacji, zauważyłem nawet dziwniejsze wyniki. Pierwszy widok podrzędny (UIScrollView) zmienia swoje granice i pochodzenie za każdym razem.
Odpowiedzi:
Można to osiągnąć, wdrażając nową właściwość o nazwie
edgesForExtendedLayout
w iOS7 SDK. Dodaj następujący kod, aby to osiągnąć,Musisz dodać powyższe w swojej
-(void)viewDidLoad
metodzie.Proszę odnieść się, Apple Doc
źródło
Nie musisz obliczyć, jak daleko chcesz wszystko przesunąć w dół, jest do tego wbudowana właściwość. W Konstruktorze interfejsów podświetl kontroler widoku, a następnie przejdź do inspektora atrybutów. Tutaj zobaczysz kilka pól wyboru obok słów „Rozszerz krawędzie”. Jak widać, na pierwszym zrzucie ekranu domyślnym wyborem jest wyświetlanie treści pod górnymi i dolnymi słupkami, ale nie pod nieprzezroczystymi słupkami, dlatego ustawienie stylu paska na półprzezroczyste działało dla Ciebie.
Jak można zobaczyć na pierwszym zrzucie ekranu, pod paskiem nawigacji ukryte są dwa elementy interfejsu użytkownika. (Włączyłem w tym celu szkielety w IB). Te elementy, UIButton i UISegmentedControl, mają zarówno początek „y” zerowy, jak i kontroler widoku, który pozwala na zawartość poniżej górnego paska.
Ten drugi zrzut ekranu pokazuje, co się stanie, gdy odznaczysz pole wyboru „Pod górnymi pasami”. Jak widać, widok kontrolerów widoku został odpowiednio przesunięty w dół, aby jego pochodzenie y znajdowało się bezpośrednio pod paskiem nawigacji.
Można to również osiągnąć programowo poprzez użycie
-[UIViewController edgesForExtendedLayout]
. Oto link do odwołania do klasy EdgeForExtendedLayout i UIRectEdgeźródło
Stworzyłem mój widok programowo, co skończyło się dla mnie:
Źródło (w sekcji topLayoutGuide na dole str.39).
źródło
topLayoutGuide
dotyczy tylko iOS7.Rozwiązanie Swift 3 / Swift 4, które działa również z plikami NIB / XIB w iOS 10+:
źródło
Jeśli chcesz, aby widok miał przezroczysty pasek nawigacyjny (co jest całkiem miłe), musisz skonfigurować contentInset lub podobny.
Oto jak to robię:
źródło
contentInset
jest własnościąUIScrollView
. Co jeśli mój główny widok nie jest podklasąUIScrollView
. Jak więc rozwiązać problem nakładania się?edgesForExtendedLayout
robi to na iOS 7. Jednak jeśli zbudujesz aplikację w iOS 7 SDK i wdrożysz ją w iOS 6, pasek nawigacyjny będzie przezroczysty, a widoki będą pod nim. Aby to naprawić zarówno w systemie iOS 7, jak i iOS 6, wykonaj następujące czynności:źródło
W pliku plist aplikacji dodaj wiersz, nazwij go „Wyświetl pasek stanu oparty na kontrolerze” i ustaw go na NIE .
źródło
Najprostszą sztuczką jest otwarcie pliku NIB i wykonanie dwóch prostych kroków:
A wynik :
źródło
Szybkie rozwiązanie:
źródło
super.viewWillAppear(animated)
Chciałbym rozwinąć odpowiedź Stunnera i dodać
if
oświadczenie, aby sprawdzić, czy jest to iOS-7, ponieważ kiedy testowałem to na iOS 6, moja aplikacja ulegała awarii.Dodanie polegałoby na dodaniu:
Sugeruję więc dodanie tej metody do
MyViewControler.m
pliku:źródło
Szybki 3
źródło
Mam scenariusz, w którym używam BannerViewController napisanego przez Apple do wyświetlania moich reklam oraz ScrollViewController osadzonego w BannerViewController.
Aby zapobiec ukrywaniu zawartości paska nawigacji, musiałem dokonać dwóch zmian.
1) Zmodyfikuj BannerViewController.m
2) Zmodyfikuj mój ScrollViewContoller
Teraz reklamy wyświetlają się poprawnie w dolnej części widoku, zamiast być zakrytymi przez pasek nawigacyjny, a zawartość u góry nie jest odcinana.
źródło
wystarczy ustawić następujący kod w widoku pojawi się.
źródło
wprowadzić ograniczenia do górnego układu w ten sposób
źródło
Swift 4.2 - Xcode 10.0 - iOS 12.0:
źródło
Dla mnie najprostszym rozwiązaniem jest dodanie dwóch kluczy do listy
źródło
Dodaj wiersz „Wyświetl pasek stanu na podstawie kontrolera” z rozwijanej listy jako wiersz w
info.plist
. Coś takiego:źródło
Miałem ten sam problem z moją aplikacją na iPady (armv7, armv7s, amr64) tylko przez przedstawienie innego UIViewController i po ich odrzuceniu przechodzi na pasek nawigacji pod paskiem stanu ... Spędzam dużo czasu, aby znaleźć rozwiązanie tego problemu. Używam storyboardu i interfejsu InterfaceBuilder dla UIViewController, co sprawia, że straszne jest ustawienie Prezentacji z FullScreen -> Bieżący kontekst i to rozwiązuje ten problem. Działa w mojej aplikacji tylko dla iPadów => iOS 8.0 (testowanie z iOS 8.1) i dla iPadów z iOS 7.1 nie działa !!
źródło
Kroki, aby ukryć pasek stanu w iOS 7:
1. Przejdź do pliku info.plist aplikacji.
2.I Ustaw, Wyświetl wygląd paska stanu na podstawie kontrolera: Boolean NO
Mam nadzieję, że rozwiązałem problem paska stanu .....
źródło
W moim przypadku wystąpiło przerwanie loadView ()
ten kod: self.edgesForExtendedLayout = UIRectEdgeNone
ale po usunięciu loadView () wszystko działało dobrze
źródło