W iOS 7 UIStatusBar
został zaprojektowany w taki sposób, że łączy się z takim widokiem:
(GUI zaprojektowany przez Tinę Tavčar )
Jest fajny, ale nieco zepsuje widok, gdy masz coś w górnej części widoku, i nakłada się na pasek stanu.
Czy istnieje proste rozwiązanie (takie jak ustawienie właściwości w info.plist), które może zmienić sposób, w jaki działa [nie nakładając się], z powrotem na to, jak to jest w iOS6?
Wiem, że bardziej prostym rozwiązaniem jest posiadanie
self.view.center.x
+ 20 punktów za każdy kontroler widoku, ale ich zmiana spowoduje zepsucie innych wymiarów (inneself.view.center.x
mogą powodować problemy z niestandardowymi sekwencjami itp.) I nagle zamienia się w żmudną pracę, która jest najlepiej tego unikać.Będę naprawdę zadowolony, jeśli ktoś może zapewnić mi jedno-liniowe rozwiązanie tego problemu.
PS Wiem, że mogę ukryć pasek stanu, wykonując takie czynności, jak posiadanie
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
W didFinishLaunchingWithOptions
metodzie, ale jest to obejście, skrót pozwalający uniknąć problemu, więc nie uważam tego za prawdziwe rozwiązanie.
UIStatusBarDefault
paska stanu powoduje, że jego zawartość jest tylko czarna. Nie zmieni sposobu, w jaki działa z powrotem na system iOS6.Odpowiedzi:
Jest to cross-posty z posta na blogu, który napisałem , ale tutaj jest pełne podsumowanie pasków stanu, pasków nawigacji i kontrolerów widoku kontenerów w iOS 7:
Nie ma sposobu na zachowanie układu paska stanu w stylu iOS 6. Pasek stanu zawsze będzie nakładał się na twoją aplikację na iOS 7
Nie należy mylić wyglądu paska stanu z układem paska stanu. Wygląd (jasny lub domyślny) nie ma wpływu na układ paska stanu (ramka / wysokość / nakładanie się). Należy również pamiętać, że pasek stanu systemu nie ma już żadnego koloru tła. Gdy interfejs API odwołuje się do UIStatusBarStyleLightContent, oznacza to biały tekst na czystym tle. UIStatusBarStyleDefault to czarny tekst na czystym tle.
Wygląd paska stanu jest kontrolowany wzdłuż jednej z dwóch wzajemnie wykluczających się ścieżek bazowych: możesz albo ustawić je programowo w tradycyjny sposób, albo UIKit zaktualizuje dla ciebie wygląd na podstawie niektórych nowych właściwości UIViewController. Ta ostatnia opcja jest domyślnie włączona. Sprawdź wartość plist aplikacji dla „Wygląd paska stanu opartego na ViewController”, aby zobaczyć, którego używasz. Jeśli ustawisz tę wartość na TAK, każdy kontroler widoku najwyższego poziomu w Twojej aplikacji (inny niż standardowy kontroler widoku kontenera UIKit) musi zastąpić preferowanyStatusBarStyle, zwracając styl domyślny lub lekki. Jeśli edytujesz wartość plist na NIE, możesz zarządzać wyglądem paska stanu przy użyciu znanych metod UIApplication.
UINavigationController zmieni wysokość swojego paska UINavigationBar na 44 punkty lub 64 punkty, w zależności od dość dziwnego i nieudokumentowanego zestawu ograniczeń. Jeśli UINavigationController wykryje, że górna część ramki jego widoku jest wizualnie przylegająca do górnej części swojego interfejsu UIWindow, wówczas rysuje pasek nawigacji o wysokości 64 punktów. Jeśli wierzchołek jego widoku nie sąsiaduje z wierzchołkiem UIWindow (nawet jeśli jest wyłączony tylko o jeden punkt), wówczas rysuje pasek nawigacji w „tradycyjny” sposób z wysokością 44 punktów. Ta logika jest wykonywana przez UINavigationController, nawet jeśli w hierarchii kontrolera widoku aplikacji znajduje się kilka dzieci. Nie ma sposobu, aby temu zapobiec.
Jeśli podasz niestandardowy obraz tła paska nawigacji, który ma tylko 44 punkty (88 pikseli), a granice widoku UINavigationController są zgodne z granicami UIWindow (jak omówiono w punkcie 4), UINavigationController narysuje obraz w ramce (0,20,320 , 44), pozostawiając 20 punktów nieprzezroczystej czarnej przestrzeni nad niestandardowym obrazem. To może pomylić Cię z myśleniem, że jesteś sprytnym programistą, który ominął zasadę nr 1, ale się mylisz. Pasek nawigacyjny ma nadal 64 punkty wysokości. Osadzenie UINavigationController w hierarchii widoków typu „przesuń, aby odsłonić” wyraźnie to wyjaśnia.
Uważaj na myląco nazwaną edgeForExtendedLayout właściwość UIViewController. Dostosowywanie krawędziForExtendedLayout w większości przypadków nic nie robi. Jedynym sposobem, w jaki UIKit używa tej właściwości, jest dodanie kontrolera widoku do kontrolera UINavigationController, a następnie kontroler UINavigationController korzysta z edgeForExtendedLayout w celu ustalenia, czy jego kontrolka widoku potomnego powinna być widoczna pod paskiem nawigacji / obszarem paska stanu. Ustawienie EdgeForExtendedLayout na samym UINavigationController nie robi nic, aby zmienić, czy UINavigationController ma obszar paska nawigacji o wysokości 44 lub 64 punktów. Ta logika znajduje się w punkcie 4. Podobna logika układu ma zastosowanie do dolnej części widoku, gdy używany jest pasek narzędzi lub UITabBarController.
Jeśli wszystko, co próbujesz zrobić, to zapobiec temu, aby niestandardowy kontroler widoku potomnego nie zasłaniał paska nawigacyjnego wewnątrz UINavigationController, a następnie ustaw edgeForExtendedLayout na UIRectEdgeNone (lub przynajmniej maskę wykluczającą UIRectEdgeTop). Ustaw tę wartość jak najwcześniej w cyklu życia kontrolera widoku.
UINavigationController i UITabBarController również spróbują uzupełnić contentInsets widoków tabel i widoków kolekcji w swojej hierarchii widoków podrzędnych. Robi to w sposób podobny do logiki paska stanu z punktu 4. Istnieje programowy sposób, aby temu zapobiec, ustawiając automatycznieAdjustsScrollViewInsets na NIE dla widoków tabeli i widoków kolekcji (domyślnie TAK). To spowodowało poważne problemy dla Whisper i Riposte, ponieważ używamy dopasowań contentInset do kontrolowania układu widoków tabeli w odpowiedzi na ruchy paska narzędzi i klawiatury.
Powtórzmy: nie ma możliwości powrotu do logiki układu paska stanu w stylu iOS 6. Aby to przybliżyć, musisz przenieść wszystkie kontrolery widoku swojej aplikacji do widoku kontenera, który jest przesunięty o 20 punktów od góry ekranu, pozostawiając celowo czarny widok za paskiem stanu, aby symulować stary wygląd. Jest to metoda, którą ostatecznie wykorzystaliśmy w Riposte i Whisper.
Apple bardzo mocno naciska, aby upewnić się, że nie spróbujesz zrobić # 9. Chcą, abyśmy przeprojektowali wszystkie nasze aplikacje tak, aby pokrywały się pasek stanu. Istnieje jednak wiele przekonywujących argumentów, zarówno z uwagi na doświadczenie użytkownika, jak i względy techniczne, dlaczego nie zawsze jest to dobry pomysł. Powinieneś robić to, co najlepsze dla swoich użytkowników, a nie tylko podążać za kaprysem platformy.
źródło
Najwyraźniej nie ma możliwości przywrócenia paska stanu systemu iOS7 z powrotem do sposobu działania w systemie iOS6.
Jednak zawsze możemy napisać niektóre kody i zmienić pasek stanu w iOS6, a to jest najkrótszy sposób, jaki mogę wymyślić:
Ustaw
UIViewControllerBasedStatusBarAppearance
sięNO
winfo.plist
(Aby zrezygnować z konieczności widok kontrolerów dostosować status bar styl, dzięki czemu możemy ustawić styl paska stanu przy użyciu metody UIApplicationstatusBarStyle).W AppDelegate
application:didFinishLaunchingWithOptions
zadzwońw celu:
Sprawdź, czy to iOS 7.
Ustaw zawartość paska stanu na białą, w przeciwieństwie do UIStatusBarStyleDefault.
Unikaj wyświetlania widoków podrzędnych, których ramki wykraczają poza widoczne granice, aby się nie pokazywały (dla widoków animowanych do widoku głównego od góry).
Stwórz złudzenie, że pasek stanu zajmuje miejsce, podobnie jak w iOS 6, przesuwając i zmieniając ramkę okna aplikacji.
W przypadku aplikacji z obracaniem ekranu
użyj NSNotificationCenter do wykrywania zmian orientacji poprzez dodanie
w
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
i utworzyć nową metodę w AppDelegate:Tak, gdy zmiana orientacji spowoduje wyzwolenie instrukcji przełączania, aby wykryć orientację ekranu aplikacji (Pionowo, Do góry nogami, Poziomo w lewo lub Poziomo w prawo) i odpowiednio zmienić ramkę okna aplikacji, aby stworzyć iluzję paska stanu iOS 6.
Aby zmienić kolor tła paska stanu:
Dodaj
w,
AppDelegate.h
aby zrobićbackground
własność w swojej klasie i zapobiec cofnięciu przydziału przez ARC. (Nie musisz tego robić, jeśli nie używasz ARC.)Następnie wystarczy utworzyć UIWindow w
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
:Nie zapomnij
@synthesize background;
po@implementation AppDelegate
!źródło
Rozwiązałem problem z następującym kodem. Służy do dodawania paska stanu. didFinishLaunchingWithOptionsW przypadku konstruktora interfejsów jest to możliwe po otwarciu w systemie iOS 6; zaczyna się od 0 pikseli.Uwaga: delty iOS 6/7 pojawiają się tylko po odznaczeniu opcji „Użyj automatycznego układania” dla kontrolera widoku w „Inspektorze plików” (ikona po lewej stronie) w okienku szczegółów.źródło
ROZWIĄZANIE :
Ustaw go w kontroler widoku lub w kontroler rootview, zastępując metodę:
źródło
Oto inne podejście do projektów, które szeroko wykorzystują Storyboard:
CEL:
Celem tego podejścia jest odtworzenie tego samego stylu paska stanu w systemie iOS7, jak w systemie iOS6 (patrz tytuł pytania „Pasek stanu systemu iOS 7 Z powrotem do stylu systemu iOS 6”).
PODSUMOWANIE:
Aby to osiągnąć, wykorzystujemy Storyboard w jak największym stopniu, przesuwając w dół elementy interfejsu, które nakładają się na pasek stanu (w iOS 7), przy użyciu delt do przywrócenia zmiany układu w dół dla iOS 6.1 lub wcześniejszej. Wynikowa dodatkowa przestrzeń w iOS 7 jest następnie zajmowana przez UIView z ustawionym tłem backgroundColor na wybrany przez nas kolor. Ten ostatni można utworzyć w kodzie lub przy użyciu Storyboard (patrz poniżej ALTERNATYWY)
ZAŁOŻENIA:
Aby uzyskać pożądany rezultat, wykonując poniższe kroki, zakłada się, że
View controller-based status bar appearance
jest ustawiony na NIE i żeStatus bar style
albo jest ustawiony na „Przezroczysty czarny styl (alfa 0,5)” lub „Nieprzezroczysty czarny styl”. Oba ustawienia można znaleźć / lub dodać w części „Informacje” w ustawieniach projektu.KROKI:
Dodaj widok podrzędny do UIWindow, aby służył jako tło paska stanu. Aby to osiągnąć, dodaj następujące elementy do aplikacji AppDelegate
application: didFinishLaunchingWithOptions:
pomakeKeyAndVisible
Ponieważ programowo dodałeś tło TYLKO dla iOS 7, będziesz musiał odpowiednio dostosować układ elementów interfejsu, które nakładają się na pasek stanu, jednocześnie zachowując ich układ dla iOS6. Aby to osiągnąć, wykonaj następujące czynności:
Use Autolayout
nie jest zaznaczone dla twojej Storyboard (dzieje się tak, ponieważ inaczej „iOS 6/7 Deltas” nie jest wyświetlany w Inspektorze rozmiarów). Aby to zrobić:ALTERNATYWY:
Aby dodać jeszcze mniej kodu w projektach obfitujących w scenorysy i mieć autorotację tła paska stanu, zamiast programowo dodawać tło paska stanu, możesz dodać kolorowy widok do każdego kontrolera widoku, który znajduje się na samej górze głównego widoku kontrolera widoku. Następnie zmieniłbyś różnicę wysokości tego nowego widoku na tę samą ujemną wartość, co wysokość twojego widoku (aby zniknął pod iOS 6).
Minusem tej alternatywy (chociaż może być nieistotna, biorąc pod uwagę zgodność autorotate) jest fakt, że ten dodatkowy widok nie jest od razu widoczny, jeśli przeglądasz Storyboard na iOS 6. Gdybyś spojrzał na „ Zarys dokumentu ”w serii ujęć.
źródło
Jeśli nie chcesz, aby kontrolery widoku nakładały się na pasek stanu (i paski nawigacji), odznacz pole „Rozszerz krawędzie pod górnymi pasami” w Konstruktorze interfejsów w Xcode 5.
źródło
Firma Apple wydała Techniczne pytania i odpowiedzi QA1797: Zapobieganie zasłanianiu paska stanu . Działa dobrze dla wersji iOS 6 i iOS 7.
źródło
Obejrzałem wiele, wiele i wiele samouczków, aby rozwiązać ten cholerny problem. Ale żaden z nich nie działa! Oto moje rozwiązanie i działa dla mnie:
Logika jest prosta. Przesuwam wszystkie widoki dzieci na self.view za pomocą 20 pikseli. To wszystko. Następnie zrzut ekranu wyświetli się tak samo jak iOS 6. Nienawidzę paska stanu iOS7! ~ "~
źródło
Mała alternatywa dla odpowiedzi Archy Holt, nieco prostsza:
za. Ustaw
UIViewControllerBasedStatusBarAppearance
naNO
info.plistb. W
AppDelegate
„sapplication:didFinishLaunchingWithOptions:
, zadzwoń:I dodaj metodę:
Możesz również rozważyć podklasę,
UIWindow
abyUIApplicationDidChangeStatusBarOrientationNotification
sobie poradzić .źródło
Użyłem tego we wszystkich moich kontrolerach widoku, to proste. Dodaj te linie do wszystkich metod viewDidLoad:
źródło
Wypróbuj tę prostą metodę ....
Krok 1 : Aby zmienić na pojedynczy
viewController
Krok 2 : Aby zmienić całą aplikację
Krok 3 : Dodaj to również
viewWillAppear
do każdego, aby dostosowaćstatusbar
wysokośćiOS7
źródło
W Konstruktorze interfejsów dostępna jest opcja, która wywołuje właściwość Delta iOS 6/7, której celem jest rozwiązanie problemu przesunięcia.
Spójrz na to w pytaniu Przepełnienie stosu Konstruktor interfejsu: Do czego służy układ UIView w wersji iOS 6/7 Delty? .
źródło
Osiągnąłem pasek stanu jak iOS 6 w iOS 7.
Ustaw UIViewControllerBasedStatusBarAppearance na NO w info.plist
Wprowadź ten kod w
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
metodzieMoże przesuwać wszystkie twoje widoki o 20 pikseli. Aby to zrobić, użyj następującego kodu w
-(void)viewDidAppear:(BOOL)animated
metodzieMusisz ustawić wartość windowHeight Userdefaults po alokacji okna w metodzie didFinishLauncing, takiej jak
źródło
height
ustawienie paska UINavigationBar na 64 zamiast 44. Wówczas pasek rozszerzy się aż do szczytu, jak w aplikacjach Apple.Jeśli używasz Konstruktora interfejsów, spróbuj tego:
W twoim pliku xib:
1) Wybierz widok główny, ustaw kolor tła na czarny (lub inny kolor, który ma być na pasku stanu)
2) Upewnij się, że tło jest niezależnym widokiem podrzędnym umieszczonym jako dziecko potomne najwyższego poziomu widoku kontrolera.
Przesuń tło, aby stać się bezpośrednim dzieckiem widoku kontrolera. Sprawdź panel automatycznej zmiany rozmiaru, aby upewnić się, że zablokowałeś wszystkie krawędzie ramki, aktywowałeś obie osie elastyczności, a jeśli jest to UIImageView, ustaw tryb zawartości na Skaluj, aby wypełnić. Programowo przekłada się to na contentMode ustawione na UIViewContentModeScaleToFill i ma ustawioną maskę automatycznego zmieniania rozmiaru na (UIViewAutoresizingF FlexibleWidth | UIViewAutoresizingFiętkiWysokość).
3) Teraz przenieś wszystko, co jest zablokowane do góry - o 20 punktów i ustaw deltę Y 6/7 na iOS na -20.
Wszystkie dzieci najwyższego poziomu, które są zablokowane w górnej ramce w panelu automatycznej zmiany rozmiaru, należy przesunąć o 20 punktów w dół i ustawić delta Y dla iOS 6/7 na -20. (Cmd zaznacz je wszystkie i kliknij strzałkę w dół 20 razy - czy jest lepszy sposób?)
4) Dostosuj wysokość delta iOS 6/7 wszystkich powyższych elementów o elastycznej wysokości. Każdy element, który był zablokowany na górze i na dole ramki i miał włączoną elastyczną wysokość w panelu automatycznego przesuwania, musi mieć również ustawioną wysokość delty iOS 6/7 na 20. Obejmuje to wspomniany wyżej widok tła. Może się to wydawać anty intuicyjne, ale ze względu na kolejność ich stosowania jest to konieczne. Najpierw ustawia się wysokość ramki (w zależności od urządzenia), następnie stosuje się delty, a na koniec stosuje się maski automatycznej zmiany rozmiaru na podstawie pozycji przesunięcia wszystkich ramek podrzędnych - przemyśl to chwilę, to będzie miało sens.
5) Wreszcie, elementy, które były zablokowane do dolnej ramki, ale nie do górnej ramki, nie potrzebują w ogóle delt.
To da ci identyczny pasek stanu w iOS7 i iOS6.
Z drugiej strony, jeśli chcesz stylizować iOS7 przy jednoczesnym zachowaniu zgodności z iOS6, ustaw wartości delta Y / wysokość delty na 0 dla widoku tła.
Aby zobaczyć więcej informacji o migracji do iOS7, przeczytaj cały post: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html
źródło
Moim rozwiązaniem było dodanie
UIView
wysokości 20 punktów w górnej części okna w systemie iOS 7. Następnie utworzyłem metodę w mojej klasie AppDelegate, aby pokazać / ukryć „stałe” tło paska stanu. Wapplication:didFinishLaunchingWithOptions:
:Następnie stworzyłem metodę wprowadzania / oddalania tła czarnego paska stanu:
Wszystko, co muszę teraz zrobić, to zadzwonić w
[appDelegate showSolidStatusBar:YES]
razie potrzeby.źródło
Może to być przytłaczający problem, jeśli używasz układu automatycznego, ponieważ nie możesz już bezpośrednio manipulować ramkami. Istnieje proste rozwiązanie bez nadmiernej pracy.
Skończyło się na napisaniu metody użytkowej w klasie użytkowej i wywołałem ją ze wszystkich
viewDidLayoutSubviews
metod kontrolerów widoków .Zastąp
viewDidLayoutSubviews
metodę w kontrolerze widoku, gdzie chcesz pasek stanu. Przeprowadzi cię przez ciężar Autolayout.źródło
Najłatwiejszym sposobem jest zainstalowanie starszego zestawu SDK w najnowszym Xcode.
Jak zainstalować starszy SDK do najnowszego Xcode?
Możesz pobrać zestaw iOS 6.1 SDK ze strony http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html lub pobrać starszy Xcode i pobrać zestaw SDK z jego zawartości
Rozpakuj i wklej ten folder do /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
Uruchom ponownie kod xcode.
Mam nadzieję, że to ci pomoże. To zadziałało dla mnie =)
źródło
Jak za pomocą
presentViewController:animated:completion:
pomieszanegowindow.rootViewController.view
, musiałem znaleźć inne podejście do tego problemu. W końcu udało mi się pracować z modami i rotacjami, podklasując UIView mojego rootViewController..h
.m
Masz teraz silne obejście animacji iOS7.
źródło
Spóźniłem się na tę odpowiedź, ale chcę tylko podzielić się tym, co zrobiłem, co jest w zasadzie najłatwiejszym rozwiązaniem
Przede wszystkim-> Przejdź do
info.plist
pliku i dodaj Styl paska stanu-> Przezroczysty czarny styl (alfa 0,5)Teraz idzie: -
Dodaj ten kod do AppDelegate.m
źródło
Moim bardzo prostym rozwiązaniem (zakładając, że obsługiwana jest tylko orientacja pionowa) jest ponowne zdefiniowanie granic okna aplikacji dla wersji iOS poniżej 7, w metodzie delegowanej aplikacji didFinishLaunchingWithOptions:
źródło
Możesz ukryć pasek stanu razem. Twoja aplikacja będzie więc pełnoekranowa. Myślę, że to najlepsze, co dostaniesz.
UIStatusBarStyleNone
lub ustaw w ustawieniach docelowych.ź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
Aby kontynuować pracę z setStatusBarHidden: Używam tej kategorii:
źródło
Znalazłem tutaj najlepsze alternatywy i rozwiązanie tego problemu z paskiem nawigacyjnym w iOS7 !!
http://www.appcoda.com/customize-navigation-status-bar-ios-7/
Mam nadzieję, że rozwiąże to wszystkie nasze pytania i obawy.
źródło
To może być za późno na udostępnienie, ale mam coś, co może komuś pomóc, próbowałem podklasować UINavigationBar i chciałem, aby wyglądał jak iOS 6 z czarnym paskiem stanu i tekstem paska stanu w kolorze białym.
Oto, co znalazłem do tego
Sprawiło, że moje tło paska stanu było czarne, tekst paska stanu biały, a pasek nawigacji biały.
iOS 9.3, XCode 7.3.1
źródło