pasek stanu iOS 7 powrót do domyślnego stylu iOS 6 w aplikacji iPhone?

W iOS 7 UIStatusBar został zaprojektowany w taki sposób, aby łączył się z widokiem w następujący sposób:

GUI zaprojektowane przez Tinę Tavčar (GUI designed by Tina Tavčar )

  • To jest fajne, ale to będzie nieco bałagan Widok, gdy masz coś w górnej części widoku, i staje się nałożony na pasek stanu.

  • Czy istnieje proste rozwiązanie (np. ustawienie właściwości w info.plist), które mogą zmienić sposób działania [nie nakładają się] z powrotem do tego, jak jest w iOS6?

  • Wiem, że prostszym rozwiązaniem jest posiadanie self.view.center.x + 20 punktów za każdy pojedynczy kontroler widoku, ale zmiana ich spowoduje, że inne wymiary będą się przekręcać (posiadanie innego self.view.center.x może powodować problemy z niestandardowymi segmentami itp.) i nagle zamienia się w żmudną pracę, której najlepiej unikać.

  • Będę bardzo zadowolony, jeśli ktoś może mi dostarczyć jednoliniowe rozwiązanie do tego.

P. S. wiem, że mogę ukryć pasek stanu, robiąc takie rzeczy jak mając

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

W metodzie didFinishLaunchingWithOptions, Ale To obejście, Skrót unikający problemu, więc nie uważam tego za realne rozwiązanie.

Author: svmrajesh, 2013-08-18

25 answers

To jest cross-post z blogu, który napisałem, ale tutaj jest pełne zestawienie pasków stanu, pasków nawigacji i kontrolerów widoku kontenera na iOS 7:

  1. Nie ma sposobu na zachowanie układu paska stanu stylu iOS 6. Pasek stanu zawsze będzie nakładał się na aplikację na iOS 7

  2. Nie należy mylić wyglądu paska stanu z układem paska stanu. Wygląd (jasny lub domyślny) nie ma wpływu na sposób ułożenia 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 API odnosi się do UIStatusBarStyleLightContent, oznaczają biały tekst na wyraźnym tle. UIStatusBarStyleDefault to czarny tekst na jasnym tle.

  3. Wygląd paska stanu jest kontrolowany wzdłuż jednej z dwóch wzajemnie wykluczających się ścieżek: możesz ustawić je programowo w tradycyjny sposób lub UIKit zaktualizuje wygląd na podstawie 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 Viewcontrollerze", aby zobaczyć, którego z nich używasz. Jeśli ustawisz tę wartość na tak, każdy kontroler widoku najwyższego poziomu w aplikacji (inny niż standardowy kontroler widoku kontenera UIKit) musi zastąpić preferredStatusBarStyle, zwracając domyślny lub lekki styl. Jeśli zmienisz wartość plist NA NO, możesz zarządzać wyglądem paska stanu za pomocą znanego Metody UIApplication.

  4. UINavigationController zmieni wysokość swojego paska UINavigationBar na 44 lub 64 punkty, w zależności od dość dziwnego i nieudokumentowanego zestawu ograniczeń. Jeśli UINavigationController wykryje, że górna część ramki widoku jest wizualnie sąsiadująca z górną częścią UIWindow, to rysuje swój pasek nawigacyjny o wysokości 64 punktów. Jeśli wierzchołek widoku nie przylega do wierzchołka UIWindow (nawet jeśli jest wyłączony tylko o jeden punkt), to rysuje jego pasek nawigacyjny w sposób "tradycyjny" o wysokości 44 punktów. ta logika jest wykonywana przez UINavigationController, nawet jeśli jest to kilka dzieci w hierarchii kontrolera widoku aplikacji. Nie ma sposobu, aby zapobiec temu zachowaniu.

  5. Jeśli podasz niestandardowy obraz tła paska nawigacyjnego, który ma tylko 44 punkty (88 pikseli) wysokości, a granice widoku kontrolera UINavigationController pasują do granic UIWindow (jak omówiono w #4), UINavigationController narysuje Twój obraz w ramce (0,20,320,44), pozostawiając 20 punktów nieprzezroczystej czarnej przestrzeni nad Twoim niestandardowym obrazem. Może to zmylić Cię do myślenia, że jesteś sprytnym programistą, który ominął zasadę # 1, ale jesteś w błędzie. Pasek nawigacyjny ma 64 punkty wysokości. Osadzenie kontrolera UINavigationController w hierarchii widoku stylów slide-to-reveal sprawia, że jest to całkowicie jasne.

  6. Uważaj na mylnie nazwaną właściwość edgesForExtendedLayout UIViewController. Regulacja krawędzi forextendedlayout nie robi nic w większości przypadków. Jedynym sposobem, w jaki UIKit używa tej właściwości jest dodanie kontrolera widoku do kontrolera UINavigationController, wtedy uinavigationcontroller używa edgesForExtendedLayout, aby określić, czy jego kontroler potomny powinien być widoczny pod paskiem nawigacji / paskiem stanu. Ustawienie edgesForExtendedLayout na samym UINavigationController nie zmienia, czy uinavigationcontroller ma 44 lub 64 punktowy wysoki obszar paska nawigacyjnego. Zobacz #4 dla tej logiki. Podobna logika układu odnosi się do dolnej części widoku, gdy używasz paska narzędzi lub kontrolera UITabBarController.

  7. Jeśli wszystko, co próbujesz zrobić, to uniemożliwić Niestandardowy kontroler widoku potomnego podklapowanie paska nawigacyjnego w uinavigationcontroller, a następnie ustawić edgesForExtendedLayout do UIRectEdgeNone (lub przynajmniej maska, która wyklucza UIRectEdgeTop). Ustaw tę wartość jak najwcześniej w cyklu życia widoku kontroler.

  8. UINavigationController i UITabBarController będą również próbować wstawiać zawartość zestawów widoków tabeli i widoków kolekcji w swojej hierarchii subview. Robi to w sposób podobny do logiki paska stanu z #4. Istnieje programowy sposób zapobiegania temu, ustawiając automatycznie adjustsscrollviewinsets NA NO dla widoków tabeli i widoków kolekcji (domyślnie jest to YES). Stwarzało to poważne problemy dla szeptu i riposty, ponieważ używamy contentInset korekty w celu kontrolowania układu widoków tabeli w odpowiedzi na ruchy paska narzędzi i klawiatury.

  9. Dla przypomnienia: nie ma możliwości powrotu do logiki układu paska stanu w stylu iOS 6. Aby to osiągnąć, należy przenieść wszystkie kontrolery widoku 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. Taką metodę wykorzystaliśmy w Ripostie i szeptać.

  10. Apple bardzo mocno naciska, aby upewnić się, że nie próbujesz zrobić #9. Chcą, abyśmy przeprojektowali wszystkie nasze aplikacje, aby podświetlić pasek stanu. Istnieje wiele przekonujących argumentów, jednak zarówno dla doświadczenia użytkownika, jak i powodów technicznych, dlaczego nie zawsze jest to dobry pomysł. Powinieneś robić to, co najlepsze dla swoich użytkowników, a nie po prostu podążać za kaprysem platformy.

 450
Author: jaredsinclair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-17 16:49:18

Aktualizacje z 19 września 2013:

Poprawiono błędy skalowania poprzez dodanie self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

poprawione literówki w wypowiedzi NSNotificationCenter


Aktualizacje z 12 września 2013:

Poprawiono UIViewControllerBasedStatusBarAppearance do NO

dodano rozwiązanie dla aplikacji z obrotem ekranu

dodano podejście do zmiany koloru tła statusu bar.


Najwyraźniej nie ma sposobu, aby przywrócić pasek stanu iOS7 do działania w iOS6.

Jednak zawsze możemy napisać kilka kodów I zmienić pasek stanu w podobny do iOS6, i jest to najkrótsza droga, jaką mogę wymyślić:]}
  1. Ustaw UIViewControllerBasedStatusBarAppearance na NO w info.plist (aby zrezygnować z kontrolerów widoku Dostosuj styl paska stanu tak, że możemy ustawić styl paska stanu za pomocą interfejsu UIApplicationstatusBarStyle metoda.)

  2. W AppDelegate ' s application:didFinishLaunchingWithOptions, call

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        [application setStatusBarStyle:UIStatusBarStyleLightContent];
        self.window.clipsToBounds =YES;
        self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    
        //Added on 19th Sep 2013
        self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
    }
    return YES;
    


W celu:

  1. Sprawdź, czy to iOS 7.

  2. Ustaw zawartość paska stanu na białą, w przeciwieństwie do UIStatusBarStyleDefault.

  3. Unikaj wyświetlania podglądów podrzędnych, których klatki wykraczają poza widoczne granice (w przypadku widoków animowanych do głównego widoku od góry).

  4. Stworzyć iluzję, że pasek stanu przesunięcie i zmiana rozmiaru ramki okna aplikacji zajmuje miejsce, tak jak w systemie iOS 6.


Dla aplikacji z obrotem ekranu,

Użyj NSNotificationCenter do wykrywania zmian orientacji poprzez dodanie

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidChangeStatusBarOrientation:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];

W if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) i utwórz nową metodę w AppDelegate:

- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
    int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
    int w = [[UIScreen mainScreen] bounds].size.width;
    int h = [[UIScreen mainScreen] bounds].size.height;
    switch(a){
        case 4:
            self.window.frame =  CGRectMake(0,20,w,h);
            break;
        case 3:
            self.window.frame =  CGRectMake(-20,0,w-20,h+20);
            break;
        case 2:
            self.window.frame =  CGRectMake(0,-20,w,h);
            break;
        case 1:
           self.window.frame =  CGRectMake(20,0,w-20,h+20);
    }
}

Tak, że gdy zmienia się orientacja, uruchomi polecenie switch, aby wykryć orientację ekranu aplikacji (pionową, do góry nogami, poziomą w lewo lub poziomą w prawo) i odpowiednio zmienić ramkę okna aplikacji, aby utworzyć iluzję paska stanu iOS 6.


Aby zmienić kolor tła paska stanu:

Dodaj

 @property (retain, nonatomic) UIWindow *background;

W AppDelegate.h Aby background stała się właściwością w twojej klasie i zapobiec jej dealokacji przez ARC. (Nie musisz tego robić, jeśli nie używasz ARC.)

Następnie wystarczy utworzyć UIWindow w if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1):
background = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, self.window.frame.size.width, 20)];
background.backgroundColor =[UIColor redColor];
[background setHidden:NO];

Nie zapomnij @synthesize background; po @implementation AppDelegate!

 121
Author: Archy Wilhes 魏何,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 17:36:51

UPDATE (NEW SOLUTION)

Ta aktualizacja jest najlepszym rozwiązaniem problemu z paskiem nawigacyjnym iOS 7.Możesz ustawić przykład koloru paska nawigacji: FakeNavBar.backgroundColor = [uicolor redColor];

Uwaga: Jeśli używasz domyślnego kontrolera nawigacyjnego, użyj starego rozwiązania.

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    if(NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0)
    {
        UIView *FakeNavBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
        FakeNavBar.backgroundColor = [UIColor whiteColor];

        float navBarHeight = 20.0;
        for (UIView *subView in self.window.subviews) {

            if ([subView isKindOfClass:[UIScrollView class]]) {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height - navBarHeight);
            } else {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height);
            }
        }
        [self.window addSubview:FakeNavBar];
    }

    return YES;

}

Stare rozwiązanie - jeśli używasz poprzedniego kodu, zignoruj poniższy kod i obrazek

to jest stara wersja rozwiązania paska nawigacyjnego iOS 7.

problem rozwiązałem za pomocą poniższego kodu. Służy do dodawania paska stanu. didFinishLaunchingWithOptions

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    UIView *addStatusBar = [[UIView alloc] init];
    addStatusBar.frame = CGRectMake(0, 0, 320, 20);
    addStatusBar.backgroundColor = [UIColor colorWithRed:0.973 green:0.973 blue:0.973 alpha:1]; //change this to match your navigation bar
    [self.window.rootViewController.view addSubview:addStatusBar];
}

i dla Interface Builder to jest dla, gdy otwierasz z iOS 6; zaczyna się od 0 pikseli.

Uwaga: Delty systemu iOS 6/7 pojawiają się tylko wtedy, gdy odznaczysz opcję "Użyj Autolayout" dla kontrolera widoku w "Inspektorze plików" ( ikona po lewej stronie) w szczegółach pane.

Tutaj wpisz opis obrazka

 40
Author: İbrahim Özbölük,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 19:36:25

Rozwiązanie:

Ustaw go w swoim viewcontrolle lub w rootviewcontroller przez nadpisanie metody:

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }
 26
Author: dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-28 15:40:36

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 iOS7, co w iOS6 (zobacz tytuł pytania "pasek stanu iOS 7 powrót do stylu iOS 6?").

Podsumowanie:

Aby to osiągnąć, używamy storyboardu w jak największym stopniu, przesuwając elementy interfejsu, które są pokrywane przez pasek stanu (w systemie iOS 7) w dół, podczas gdy używamy deltas, aby przywrócić zmiana układu w dół dla systemu iOS 6.1 lub wcześniejszego. Uzyskana dodatkowa przestrzeń w systemie iOS 7 jest następnie zajmowana przez interfejs użytkownika z kolorem tła ustawionym na wybrany przez nas kolor. Ten ostatni może być utworzony w kodzie lub za pomocą storyboardu (zobacz Alternatywy poniżej)

Założenia:

Aby uzyskać pożądany wynik, wykonując poniższe kroki, zakłada się, że View controller-based status bar appearance jest ustawione na NO, a {[2] } jest ustawione na "Przezroczysty czarny Styl (Alfa 0,5) "lub"nieprzezroczysty czarny Styl". Oba ustawienia można znaleźć/lub dodać w "Info" w ustawieniach projektu.

Kroki:

  • Dodaj subview do UIWindow, aby służyć jako tło paska stanu. Aby to osiągnąć, dodaj następujące elementy application: didFinishLaunchingWithOptions: Po makeKeyAndVisible

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        UIView *statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, yourAppsUIWindow.frame.size.width, 20)];
        statusBarBackgroundView.backgroundColor = [UIColor blackColor];
        [yourAppsUIWindow addSubview:statusBarBackgroundView];
    }
    
  • Ponieważ programowo dodałeś tło tylko dla iOS 7, będziesz musiał odpowiednio dostosować układ elementów interfejsu użytkownika, które są pokrywane przez pasek stanu, zachowując ich układ dla iOS6. Aby to osiągnąć, wykonaj następujące czynności:

    • upewnij się, że Use Autolayout nie jest zaznaczona dla Twojego storyboardu (dzieje się tak, ponieważ w przeciwnym razie "iOS 6/7 Deltas" nie jest wyświetlany w Inspektorze rozmiaru). Aby to zrobić:
      • wybierz plik Storyboard
      • Pokaż narzędzia
      • wybierz "Pokaż Inspektora plików"
      • w polu "Interface Builder Document" odznacz opcję "Use Autolayout"
    • Opcjonalnie, aby pomóc ci monitorować zmiany układu zarówno dla iOS 7 jak i 6 po ich zastosowaniu wybierz "Asystent edytora", wybierz "Podgląd" i " iOS 6.1 lub wcześniejszy": Tutaj wpisz opis obrazkaTutaj wpisz opis obrazka
    • teraz wybierz element interfejsu użytkownika, który chcesz dostosować, aby nie nakładał się na pasek stanu
    • wybierz "Pokaż Inspektora rozmiaru" w kolumnie narzędzia
    • zmień położenie elementu interfejsu użytkownika wzdłuż osi Y o taką samą wysokość jak wysokość paska stanu bg: Tutaj wpisz opis obrazka
    • I zmienić wartość iOS6 / 7 Deltas Dla Y o taką samą wartość ujemną jak statusbar bg wysokość (zwróć uwagę na zmianę w podglądzie iOS 6, jeśli go używasz): Tutaj wpisz opis obrazka

Alternatywy:

Aby dodać jeszcze mniej kodu w dużych projektach i mieć autorotate tła paska stanu, zamiast programowo dodawać tło dla paska stanu, możesz dodać kolorowy widok do każdego kontrolera widoku, który znajduje się na samej górze głównego widoku wspomnianego kontrolera viewcontrollera. Wtedy zmienisz deltę wysokości tego nowego widoku na tę samą ujemna kwota jako wysokość widoku (aby zniknął pod iOS 6).

Minusem tej alternatywy (chociaż może znikoma, biorąc pod uwagę kompatybilność z autorotate) jest fakt, że ten dodatkowy widok nie jest natychmiast widoczny, jeśli oglądasz Scenorysę dla iOS 6. Wiedziałbyś tylko, że jest tam, gdybyś spojrzał na" zarys dokumentu " storyboardu.

 17
Author: sts2055,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 15:16:29

Jeśli nie chcesz, aby Kontrolery widoku były nakładane na pasek stanu (i paski nawigacji), odznacz pole" Extend Edges Under Top Bars " w Interface Builder w Xcode 5.

Usuń zaznaczenie wysuń krawędzie pod górnym paskiem

 12
Author: nvrtd frst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-22 13:28:43

Apple wydany pytania techniczne QA1797: zapobieganie zasłanianiu widoków przez pasek stanu. Działa dobrze dla wersji iOS 6 i iOS 7.

 11
Author: Igor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-16 15:54:40

Obejrzałem wiele wiele wiele 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:

if( [[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f ) {
    float statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
    for( UIView *v in [self.view subviews] ) {
        CGRect rect = v.frame;
        rect.origin.y += statusBarHeight;
        v.frame = rect;
    }
}
Logika jest prosta. Zmieniam poglądy wszystkich dzieci na jaźń.widok z 20 pikseli. To wszystko. Następnie zrzut ekranu wyświetli się tak, jak zrobił to iOS 6. Nienawidzę paska stanu iOS7! ~"~
 8
Author: firestoke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-30 21:27:38

Mała alternatywa dla odpowiedzi Archy ' ego Holta, nieco prostsza:

A. Ustaw UIViewControllerBasedStatusBarAppearance na NO w info.plist

B. In AppDelegate'S application:didFinishLaunchingWithOptions:, call:

if ([[UIDevice currentDevice].systemVersion floatValue] < 7)
{
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
else
{
    // handling statusBar (iOS7)
    application.statusBarStyle = UIStatusBarStyleLightContent;
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    self.window.clipsToBounds = YES;

    // handling screen rotations for statusBar (iOS7)
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientationNotification:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}

I dodać metodę:

- (void)applicationDidChangeStatusBarOrientationNotification:(NSNotification *)notification
{
    // handling statusBar (iOS7)
    self.window.frame = [UIScreen mainScreen].applicationFrame;
}

Możesz również rozważyć podklasowanie UIWindow do obsługi UIApplicationDidChangeStatusBarOrientationNotification.

 6
Author: Cœur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-16 15:52:45

Używałem tego we wszystkich kontrolerach widoku, to proste. Dodaj tę linię we wszystkich metodach viewDidLoad:

- (void)viewDidLoad{
    //add this 2 lines:
    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

    [super viewDidLoad];
}
 5
Author: IgniteCoders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 15:40:58

Wypróbuj tę prostą metodę....

Krok 1 : zmiana w jednym viewController

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

Krok 2 : zmiana w całej aplikacji

info.plist
      ----> Status Bar Style
                  --->UIStatusBarStyle to UIStatusBarStyleBlackOpaque

Krok 3: Dodaj również to w każdym viewWillAppear, aby dostosować statusbar wysokość dla iOS7

    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 7) {
        CGRect frame = [UIScreen mainScreen].bounds;
        frame.origin.y+=20.0;
        frame.size.height-= 20.0;
        self.view.frame = frame;
        [self.view layoutIfNeeded];
    }
 4
Author: svmrajesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-25 06:11:48

Istnieje opcja w budownictwie interfejsu, która wywołuje właściwość iOS 6/7 Delta, która ma na celu rozwiązanie problemu offsetu.

Spójrz na to w pytaniu Stack Overflow Interface Builder: do czego służą Delty układu UIView iOS 6/7?.

 3
Author: Tony Fung Choi Fung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:36

Osiągnąłem pasek stanu jak iOS 6 W iOS 7.

Ustaw Uiviewcontrollerbasedstatusbarapearance NA NO w info.plist

Przepisz ten kod w - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions metodzie

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    [application setStatusBarStyle:UIStatusBarStyleLightContent];
    self.window.clipsToBounds =YES;
    self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height);

    //Added on 19th Sep 2013
    NSLog(@"%f",self.window.frame.size.height);
    self.window.bounds = CGRectMake(0,0, self.window.frame.size.width, self.window.frame.size.height);
}

Może obniżyć wszystkie twoje poglądy do 20 pixels.To over come to use following code in -(void)viewDidAppear:(BOOL)animated method

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    CGRect frame=self.view.frame;
    if (frame.size.height==[[NSUserDefaults standardUserDefaults] floatForKey:@"windowHeight"])
    {
        frame.size.height-=20;
    }
    self.view.frame=frame;
}

Musisz ustawić wartość windowHeight Userdefaults po alokacji okna w metodzie didFinishLauncing jak

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"];
 3
Author: Desert Rose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-20 13:15:26

Jeśli używasz Interface builder, spróbuj tego:

W Twoim pliku xib:

1) Wybierz główny widok, Ustaw kolor tła na czarny (lub dowolny kolor, który chcesz, aby pasek stanu był

2) Upewnij się, że tło jest niezależnym podglądem podrzędnym, umieszczonym jako najwyższy poziom widoku kontrolera.
Przenieś tło, aby stało się bezpośrednim potomkiem widoku kontrolera. Sprawdź panel automatycznego ustawiania, aby upewnić się, że wszystkie krawędzie ramki zostały zablokowane, aktywowane obie osie elastyczności, a jeśli jest to UIImageView, ustawić tryb zawartości skalować do wypełnienia. Programowo przekłada się to na contentMode ustawiony na UIViewContentModeScaleToFill i ma maskę automatycznej zmiany rozmiaru ustawioną na (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight).

3) Teraz przenieś wszystko, co jest zablokowane do góry - dół o 20 pkt i ustaw iOS 6/7 delta Y na -20.
Wszystkie dzieci najwyższego poziomu, które są zablokowane do górnej ramki w automatycznym ustawianiu panel należy przesunąć w dół o 20pts i ustawić iOS 6/7 delta Y na -20. (Cmd wybierz wszystkie z nich i kliknij strzałkę w dół 20 razy - czy jest lepszy sposób ktoś?)

4) Dostosuj wysokość delta iOS 6/7 wszystkich powyższych elementów, które miały elastyczną wysokość. Wszystkie elementy, które były zablokowane do górnej i dolnej ramki i miały elastyczną wysokość włączoną w panelu autozapisu, muszą również mieć wysokość delta systemu iOS 6/7 ustawioną na 20. Który obejmuje wspomniany widok tła powyżej. Może się to wydawać nieintuicyjne, ale ze względu na kolejność, w jakiej są stosowane, jest to konieczne. Wysokość ramki jest ustawiana najpierw (na podstawie urządzenia), następnie są stosowane delty, a na koniec maski autozapisu są stosowane na podstawie pozycji przesunięcia wszystkich ramek potomnych - przemyśl to trochę, to będzie miało sens.

5) Wreszcie, elementy, które były zablokowane do dolnej ramki, ale nie do górnej ramki, w ogóle nie potrzebują delt.

That will give you the identyczny pasek stanu w iOS7 i iOS6.

Z drugiej strony, jeśli chcesz stylizować iOS7 przy zachowaniu zgodności z iOS6, ustaw wartości wysokości delta Y / delta na 0 dla widoku tła.

Aby zobaczyć więcej informacji o migracji iOS7 Przeczytaj cały post: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html

 2
Author: thebman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-23 00:30:31

Moim rozwiązaniem było dodanie UIView z wysokością 20 punktów na górze okna, gdy na iOS 7. Następnie utworzyłem metodę w mojej klasie AppDelegate, aby pokazać / ukryć tło paska stanu "solid". W application:didFinishLaunchingWithOptions::

// ...

// Add a status bar background
self.statusBarBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 20.0f)];
self.statusBarBackground.backgroundColor = [UIColor blackColor];
self.statusBarBackground.alpha = 0.0;
self.statusBarBackground.userInteractionEnabled = NO;
self.statusBarBackground.layer.zPosition = 999; // Position its layer over all other views
[self.window addSubview:self.statusBarBackground];

// ...
return YES;

Następnie stworzyłem metodę, aby przyciemnić / usunąć czarne tło paska stanu:

- (void) showSolidStatusBar:(BOOL) solidStatusBar
{
    [UIView animateWithDuration:0.3f animations:^{
        if(solidStatusBar)
        {
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
            self.statusBarBackground.alpha = 1.0f;
        }
        else
        {
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
            self.statusBarBackground.alpha = 0.0f;
        }
    }];
}
Wszystko, co muszę teraz zrobić, to zadzwonić, gdy będzie trzeba.
 2
Author: Alexandre OS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 21:12:56

Może to być przytłaczający problem, jeśli używasz układu Auto, ponieważ nie możesz już bezpośrednio manipulować ramkami. Jest proste rozwiązanie bez zbyt wiele pracy.

Skończyłem pisząc metodę utility w klasie Utility i wywołałem ją ze wszystkich kontrolerów widoku viewDidLayoutSubviews.

+ (void)addStatusBarIfiOS7:(UIViewController *)vc
    {
        if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
            CGRect viewFrame = vc.view.frame;
            if(viewFrame.origin.y == 20) {
                //If the view's y origin is already 20 then don't move it down.
                return;
            }
            viewFrame.origin.y+=20.0;
            viewFrame.size.height-= 20.0;
            vc.view.frame = viewFrame;
            [vc.view layoutIfNeeded];
        }
    }

Nadpisuje metodę viewDidLayoutSubviews w kontrolerze widoku, gdzie chcesz pasek stanu. To pomoże Ci przetrwać ciężar Autolayout.

- (void)viewDidLayoutSubviews
{
    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    [super viewDidLayoutSubviews];
    [MyUtilityClass addStatusBarIfiOS7:self];
}
 2
Author: Selvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-15 17:31:30

Najprostszym sposobem na to jest zainstalowanie starszego SDK na najnowszym Xcode.

Jak zainstalować starsze SDK na najnowszym Xcode?

  1. Możesz pobrać zestaw SDK iOS 6.1 z http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html lub pobranie starszego Xcode i pobranie SDK z jego zawartości

  2. Rozpakuj i wklej ten folder do /Applications / Xcode.app / Contents/Developer/Platforms / iPhoneOS.Platforma / programista / SDKs

  3. Uruchom ponownie xcode.

  4. Możesz teraz wybrać starsze SDK w Ustawieniach budowania projektu

Mam nadzieję, że ci pomoże. U mnie zadziałało =)

 1
Author: marcelosalloum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-03 19:06:25

Jako że używałem presentViewController:animated:completion: window.rootViewController.view, musiałem znaleźć inne podejście do tej kwestii. W końcu dostałem go do pracy z modalami i obrotami, podklasując UIView mojego rootViewController.

.h

@interface RootView : UIView

@end

.m

@implementation RootView

-(void)setFrame:(CGRect)frame
{
    if (self.superview && self.superview != self.window)
    {
        frame = self.superview.bounds;
        frame.origin.y += 20.f;
        frame.size.height -= 20.f;
    }
    else
    {
        frame = [UIScreen mainScreen].applicationFrame;
    }

    [super setFrame:frame];
}

- (void)layoutSubviews
{
    self.frame = self.frame;

    [super layoutSubviews];
}

@end

Masz teraz silne obejście dla animacji iOS7.

 1
Author: Cœur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-08 16:47:14

Jestem spóźniony na tę odpowiedź, ale chcę się podzielić tym, co zrobiłem, czyli w zasadzie najprostsze rozwiązanie

Przede wszystkim - > przejdź do swojego pliku info.plist i Dodaj styl paska stanu - > Przezroczysty czarny Styl(Alfa 0.5)

Teraz ,zaczyna się:-

Dodaj ten kod do swojej aplikacji.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
     //Whatever your code goes here
  if(kDeviceiPad){

     //adding status bar for IOS7 ipad
         if (IS_IOS7) {
              UIView *addStatusBar = [[UIView alloc] init];
              addStatusBar.frame = CGRectMake(0, 0, 1024, 20);
              addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar
              [self.window.rootViewController.view addSubview:addStatusBar];
                    }
                }
    else{

         //adding status bar for IOS7 iphone
        if (IS_IOS7) {
            UIView *addStatusBar = [[UIView alloc] init];
            addStatusBar.frame = CGRectMake(0, 0, 320, 20);
            addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern
            [self.window.rootViewController.view addSubview:addStatusBar];
        }

    return YES;
   }
 1
Author: Vizllx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-26 06:39:50

Moim bardzo prostym rozwiązaniem (zakładając, że masz obsługiwaną tylko orientację pionową) jest ponowne zdefiniowanie granic okien aplikacji dla wersji iOS poniżej 7, w metodzie app delegate didFinishLaunchingWithOptions:

CGRect screenBounds = [[UIScreen mainScreen] bounds];
if ([HMService getIOSVersion] < 7) {
    // handling statusBar (iOS6) by leaving top 20px for statusbar.
    screenBounds.origin.y = 20;
    self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
else {
    self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
 0
Author: jki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-19 14:55:07

Możesz ukryć pasek stanu razem. Więc Twoja aplikacja będzie pełnoekranowa. Myślę, że to najlepsze, co dostaniesz.

UIStatusBarStyleNone lub ustawić w Ustawieniach docelowych.

 0
Author: Christopher Rex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-22 13:23:41

Kroki ukrywania paska stanu w systemie iOS 7:

1.Przejdź do informacji o aplikacji.plik plist.

2.I ustaw, wyświetl wygląd paska stanu opartego na kontrolerze: Boolean NO

Mam nadzieję, że rozwiązałem problem z paskiem stanu.....

 0
Author: chandrika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-30 11:43:30

Aby kontynuować pracę z setStatusBarHidden: używam tej kategorii:

@interface UIApplication (StatusBar)

-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden;

@end

@implementation UIApplication (StatusBar)

-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden{
    if (!IOS7) {
        [self setStatusBarHidden:statusBarHidden];
        return;
     }

    if ([self isStatusBarHidden] == statusBarHidden) {
        return;
    }

    [self setStatusBarHidden:statusBarHidden];
    [self keyWindow].clipsToBounds = YES;
    CGFloat offset = statusBarHidden ? 0 : 20;
    [self keyWindow].frame =  CGRectMake(0,offset,[self keyWindow].frame.size.width,[self keyWindow].frame.size.height-offset);
    [self keyWindow].bounds = CGRectMake(0, offset, [self keyWindow].frame.size.width,[self keyWindow].frame.size.height);
}

@end
 0
Author: Tomer Even,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-08 21:25:46

Znalazłem tutaj najlepsze alternatywy i rozwiązanie dla tego problemu z paskiem nawigacyjnym w iOS7!!

Http://www.appcoda.com/customize-navigation-status-bar-ios-7/

Mam nadzieję, że to rozwiąże wszystkie nasze pytania i zmartwienia.

 0
Author: simbesi.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-26 06:30:30

To może być za późno, aby udostępnić, ale mam coś, co może komuś pomóc, próbowałem podklasować Pasek 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 w pracy

        self.navigationController?.navigationBar.clipsToBounds = true
        self.navigationController?.navigationBar.translucent = false
        self.navigationController?.navigationBar.barStyle = .Black
        self.navigationController?.navigationBar.barTintColor = UIColor.whiteColor()

Sprawiło, że tło mojego paska stanu było czarne, tekst paska stanu biały, a kolor paska nawigacji biały.

IOS 9.3, XCode 7.3.1

 0
Author: channi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-31 11:16:30