statusbar - top - toolbar ios




iOS 7 Statusleiste zurück zu iOS 6 Standard-Stil in iPhone App? (17)

In iOS 7 wurde die UIStatusBar so entworfen, dass sie mit der Ansicht folgendermaßen verschmilzt:

(GUI von Tina Tavčar entworfen )

  • Es ist cool, aber es wird etwas verwirren, wenn Sie etwas im oberen Teil Ihrer Ansicht haben, und es wird mit der Statusleiste überlappt.

  • Gibt es eine einfache Lösung (z. B. das Festlegen einer Eigenschaft in info.plist), die die Art und Weise ändern kann, wie es funktioniert (nicht überlappend), wie es in iOS6 ist?

  • Ich weiß, eine einfachere Lösung ist, self.view.center.x + 20 Punkte für jeden einzelnen View-Controller zu haben, aber wenn man sie ändert, werden andere Dimensionen verschraubt (ein anderes self.view.center.x kann zu Problemen bei benutzerdefinierten Segmenten führen) usw.) und plötzlich wird es zu einer langweiligen Arbeit, die man am besten vermeidet.

  • Ich bin wirklich froh, wenn mir jemand eine One-Liner-Lösung dafür liefern kann.

PS Ich weiß, dass ich die Statusleiste ausblenden kann, indem ich Dinge wie das tun habe

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

In didFinishLaunchingWithOptions Methode, aber das ist eine Problemumgehung, eine Abkürzung das Problem zu vermeiden, so dass ich nicht als eine echte Lösung.


Updates am 19. September 2013:

Fehler bei der Skalierung behoben durch Hinzufügen von self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

korrigierte Tippfehler in der NSNotificationCenter Anweisung


Aktualisierungen am 12. September 2013:

UIViewControllerBasedStatusBarAppearance auf NO korrigiert

hat eine Lösung für Apps mit Bildschirmdrehung hinzugefügt

hinzugefügt, um die Hintergrundfarbe der Statusleiste zu ändern.


Es gibt anscheinend keine Möglichkeit, die iOS7-Statusleiste wieder so zu machen, wie sie in iOS6 funktioniert.

Wir können jedoch immer einige Codes schreiben und die Statusleiste in iOS6-artig umwandeln, und dies ist der kürzeste Weg, den ich mir vorstellen kann:

  1. Setzen Sie UIViewControllerBasedStatusBarAppearance in der info.plist UIViewControllerBasedStatusBarAppearance auf NO ( info.plist , dass View-Controller den Statusleistenstil anpassen, können Sie den Statusleistenstil mithilfe der UIApplicationStatusBarStyle-Methode festlegen.)

  2. In der AppDelegate- 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;
    


um zu:

  1. Überprüfen Sie, ob es iOS 7 ist.

  2. Setzen Sie den Inhalt der Statusleiste im Gegensatz zu UIStatusBarStyleDefault auf Weiß.

  3. Vermeiden Sie Subviews, deren Frames über die sichtbaren Grenzen hinausreichen (für Ansichten, die von oben in die Hauptansicht animieren).

  4. Erstellen Sie die Illusion, dass die Statusleiste wie bei iOS 6 Platz beansprucht, indem Sie den Fensterrahmen der App verschieben und deren Größe ändern.


Für Apps mit Bildschirmdrehung

Verwenden Sie NSNotificationCenter, um Orientierungsänderungen zu erkennen, indem Sie hinzufügen

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

in if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) und erstellen Sie eine neue Methode in 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);
    }
}

Wenn sich die Ausrichtung ändert, wird eine switch-Anweisung ausgelöst, um die Bildschirmausrichtung der App zu erkennen (Hochformat, Auf den Kopf, Querformat links oder Querformat rechts) und den Fensterrahmen der App zu ändern, um die iOS 6-Statusleiste zu erstellen.


So ändern Sie die Hintergrundfarbe Ihrer Statusleiste:

Hinzufügen

 @property (retain, nonatomic) UIWindow *background;

in AppDelegate.h , um background einer Eigenschaft in Ihrer Klasse zu machen und ARC AppDelegate.h zu AppDelegate.h , die AppDelegate.h . (Sie müssen es nicht tun, wenn Sie ARC nicht verwenden.)

Danach müssen Sie nur das UIWindow in 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];

Vergessen Sie nicht @synthesize background; nach @implementation AppDelegate !


UPDATE (NEUE LÖSUNG)

Dieses Update ist die beste Lösung für das iOS 7-Navigationsleistenproblem. Sie können ein Beispiel für die Navigationsleiste festlegen: FakeNavBar.backgroundColor = [UIColor redColor];

Hinweis: Wenn Sie den Standard-Navigationscontroller verwenden, verwenden Sie bitte die alte Lösung.

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;

}

ALTE LÖSUNG - Wenn Sie vorherigen Code verwenden, ignorieren Sie bitte folgenden Code und Bild

Dies ist eine alte Version der iOS 7-Navigationsleistenlösung.

Ich habe das Problem mit dem folgenden Code gelöst. Dies ist zum Hinzufügen einer Statusleiste. 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];
}

Und für Interface Builder ist dies, wenn Sie mit iOS 6 öffnen; Es beginnt bei 0 Pixel.

Hinweis: iOS 6/7 Deltas werden nur angezeigt, wenn Sie die Option "Auto-Layout verwenden" für den View-Controller im "Datei-Inspektor" (Symbol ganz links) im Detailbereich deaktivieren.


Dies ist ein Cross- Post von einem Blogpost, den ich geschrieben habe , aber hier ist die vollständige Übersicht über Statusleisten, Navigationsleisten und Containeransicht-Controller auf iOS 7:

  1. Es gibt keine Möglichkeit, das Statusleistenlayout des iOS 6-Stils beizubehalten. Die Statusleiste überschneidet sich immer mit Ihrer Anwendung auf iOS 7

  2. Verwechseln Sie nicht die Darstellung der Statusleiste mit dem Layout der Statusleiste. Die Darstellung (hell oder default) hat keinen Einfluss auf die Anordnung der Statusleiste (Rahmen / Höhe / Überlappung). Es ist auch wichtig zu beachten, dass die Systemstatusleiste keine Hintergrundfarbe mehr hat. Wenn sich die API auf UIStatusBarStyleLightContent bezieht, meinen sie weißen Text auf einem klaren Hintergrund. UIStatusBarStyleDefault ist schwarzer Text auf einem klaren Hintergrund.

  3. Die Darstellung der Statusleiste wird auf einem der beiden gegenseitig ausschließenden Basispfade gesteuert: Sie können sie entweder auf herkömmliche Weise programmgesteuert festlegen, oder UIKit aktualisiert die Darstellung für Sie anhand einiger neuer Eigenschaften von UIViewController. Die letztere Option ist standardmäßig aktiviert. Überprüfen Sie den Plist-Wert Ihrer App für "ViewController-Based Status Bar Appearance", um zu sehen, welche Sie verwenden. Wenn Sie diesen Wert auf YES setzen, muss jeder View Controller der obersten Ebene in Ihrer App (mit Ausnahme eines standardmäßigen UIKit-Containeransicht-Controllers) preferredStatusBarStyle überschreiben und entweder den Standardstil oder den Lichtstil zurückgeben. Wenn Sie den PLIST-Wert auf NO setzen, können Sie die Darstellung der Statusleiste mit den vertrauten UIApplication-Methoden verwalten.

  4. UINavigationController ändert die Höhe seiner UINavigationBar entweder auf 44 oder 64 Punkte, abhängig von einem ziemlich seltsamen und nicht dokumentierten Satz von Constraints. Wenn der UINavigationController feststellt, dass der obere Teil des Rahmens seiner Ansicht visuell mit dem oberen Bereich des UIWindows übereinstimmt, wird die Navigationsleiste mit einer Höhe von 64 Punkten gezeichnet. Wenn die Oberkante der Ansicht nicht mit der Oberkante der Benutzeroberfläche übereinstimmt (auch wenn sie nur um einen Punkt abweicht), wird die Navigationsleiste auf die "traditionelle" Weise mit einer Höhe von 44 Punkten gezeichnet. Diese Logik wird von UINavigationController selbst dann ausgeführt, wenn sich mehrere untergeordnete Elemente in der View-Controller-Hierarchie Ihrer Anwendung befinden. Es gibt keine Möglichkeit, dieses Verhalten zu verhindern.

  5. Wenn Sie ein benutzerdefiniertes Navigationsleisten-Hintergrundbild mit nur 44 Punkten (88 Pixel) bereitstellen und die Grenzen der UINavigationController-Ansicht mit den Grenzen des UIWindows übereinstimmen (wie in # 4 besprochen), zeichnet der UINavigationController Ihr Bild im Rahmen (0,20,320 , 44) und hinterlässt 20 opak schwarze Punkte über Ihrem benutzerdefinierten Bild. Das könnte Sie verwirren, wenn Sie denken, dass Sie ein cleverer Entwickler sind, der die Regel # 1 umgangen hat, aber Sie irren sich. Die Navigationsleiste ist immer noch 64 Punkte groß. Die Einbettung eines UINavigationControllers in eine Slide-to-enthüllende Style-View-Hierarchie macht dies deutlich.

  6. Vorsicht vor der verwirrend benannten Eigenschaft kitsForExtendedLayout von UIViewController. Das Anpassen von edgesForExtendedLayout führt in den meisten Fällen nicht zu einer Änderung. Die einzige Möglichkeit, UIKit diese Eigenschaft zu verwenden, besteht darin, dass Sie, wenn Sie einem UINavigationController einen View-Controller hinzufügen, der UINavigationController kitesForExtendedLayout verwendet, um zu bestimmen, ob der untergeordnete View-Controller unterhalb des Navigationsleisten- / Statusleistenbereichs sichtbar sein soll. Das Setzen von edgesForExtendedLayout auf dem UINavigationController selbst ändert nichts daran, ob der UINavigationController einen 44 oder 64 Punkte hohen Navigationsleistenbereich hat oder nicht. Siehe 4 für diese Logik. Eine ähnliche Layoutlogik gilt für den unteren Teil Ihrer Ansicht, wenn Sie eine Symbolleiste oder UITabBarController verwenden.

  7. Wenn Sie lediglich verhindern möchten, dass der benutzerdefinierte untergeordnete Ansichts-Controller die Navigationsleiste in einem UINavigationController unterschneidet, legen Sie coresForExtendedLayout auf UIRectEdgeNone fest (oder mindestens eine Maske, die UIRectEdgeTop ausschließt). Setzen Sie diesen Wert so früh wie möglich im Lebenszyklus Ihres View-Controllers.

  8. UINavigationController und UITabBarController versuchen auch, die contentInets von Tabellenansichten und Auflistungsansichten in ihrer Unteransichtshierarchie aufzufüllen. Dies geschieht in ähnlicher Weise wie die Statusleistenlogik von # 4. Es gibt eine programmatische Möglichkeit, dies zu verhindern, indem Sie für Ihre Tabellenansichten und Sammlungsansichten automatisch die Einstellung "ScrollViewInsets" auf "NO" setzen (Standardeinstellung: YES). Dies stellte einige ernsthafte Probleme für Whisper und Riposte dar, da wir containInset-Anpassungen verwenden, um das Layout von Tabellenansichten als Reaktion auf Symbolleisten- und Tastaturbewegungen zu steuern.

  9. Um es noch einmal zu wiederholen: Es gibt keine Möglichkeit, zu der Statusleisten-Layout-Logik von iOS 6 zurückzukehren. Um dies zu erreichen, müssen Sie alle View-Controller Ihrer App in eine Containeransicht verschieben, die vom oberen Rand des Bildschirms um 20 Punkte versetzt ist. Hinter der Statusleiste wird eine absichtlich schwarze Ansicht angezeigt, um das alte Erscheinungsbild zu simulieren. Dies ist die Methode, die wir in Riposte und Whisper verwendet haben.

  10. Apple drängt sehr hart, um sicherzustellen, dass Sie nicht versuchen, # 9 zu tun. Sie möchten, dass wir alle unsere Apps so umgestalten, dass die Statusleiste nicht mehr angezeigt wird. Es gibt jedoch viele schlüssige Argumente für die Benutzererfahrung und technische Gründe, warum dies nicht immer eine gute Idee ist. Sie sollten das tun, was für Ihre Benutzer am besten ist, und nicht einfach der Laune der Plattform folgen.


Eine kleine Alternative zu Archy Holts Antwort, ein bisschen einfacher:

ein. Setzen Sie UIViewControllerBasedStatusBarAppearance auf NO in info.plist

b. In AppDelegate 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];
}

Und füge die Methode hinzu:

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

Sie können auch das Unterklassen- UIWindow in Betracht UIWindow , um UIApplicationDidChangeStatusBarOrientationNotification selbst zu behandeln.


Hier ein weiterer Ansatz für Projekte, die das Storyboard umfangreich nutzen:

TOR:

Ziel dieses Ansatzes ist es, den gleichen Statusleisten-Stil in iOS7 wie in iOS6 wiederherzustellen (siehe Fragetitel "iOS 7 Statusleiste Zurück zu iOS 6 Stil?").

ZUSAMMENFASSUNG:

Um dies zu erreichen, verwenden wir das Storyboard so weit wie möglich, indem wir die Elemente der Benutzeroberfläche, die von der Statusleiste (unter iOS 7) überlagert werden, verschieben und Deltas verwenden, um die Änderung des Layouts für iOS 6.1 oder früher rückgängig zu machen. Der resultierende zusätzliche Platz in iOS 7 wird dann von einer UIView belegt, wobei die Hintergrundfarbe auf eine Farbe unserer Wahl eingestellt ist. Letzteres kann im Code oder mit dem Storyboard erstellt werden (siehe unten ALTERNATIVEN)

ANNAHMEN:

Um das gewünschte Ergebnis zu erhalten, wenn Sie die folgenden Schritte ausführen, wird angenommen, dass die View controller-based status bar appearance auf NEIN gesetzt ist und dass der Status bar style Ihrer View controller-based status bar appearance entweder auf "Transparenter Schwarzstil (Alpha von 0,5)" oder "Opak Schwarz" eingestellt ist Stil". Beide Einstellungen finden / finden Sie unter "Info" in Ihren Projekteinstellungen.

SCHRITTE:

  • Fügen Sie dem UIWindow eine Unteransicht hinzu, die als Statusleistenhintergrund dient. Fügen Sie Folgendes zu Ihrer AppDelegate- application: didFinishLaunchingWithOptions: hinzu, um dies zu erreichen application: didFinishLaunchingWithOptions: after 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];
    }
    
  • Da Sie NUR einen Hintergrund für iOS 7 programmgesteuert hinzugefügt haben, müssen Sie das Layout Ihrer UI-Elemente, die von der Statusleiste überlappt werden, entsprechend anpassen, während Sie ihr Layout für iOS6 beibehalten. Um dies zu erreichen, machen Sie folgendes:

    • Stellen Use Autolayout sicher, dass die Use Autolayout für Ihr Storyboard Use Autolayout ist (andernfalls wird "iOS 6/7 Deltas" nicht im Größen-Inspektor angezeigt). Um dies zu tun:
      • Wählen Sie Ihre Storyboard-Datei
      • Zeige Dienstprogramme
      • Wählen Sie "Dateiinspektor anzeigen"
      • Unter "Interface Builder Document" deaktivieren Sie "Auto-Layout verwenden"
    • Optional können Sie die Änderungen des Layouts für iOS 7 UND 6 während der Anwendung überprüfen, indem Sie den "Assistenten-Editor" auswählen, "Vorschau" und "iOS 6.1 oder früher" wählen:
    • Wählen Sie nun das Oberflächenelement, das Sie anpassen möchten, so dass es nicht mehr von der Statusleiste überlappt wird
    • Wählen Sie "Größeninspektor anzeigen" in der Spalte "Dienstprogramme"
    • Positionieren Sie Ihr UI-Element entlang der Y-Achse um den gleichen Betrag wie die Statusleiste bg height:
    • Und ändere den iOS6 / 7-Deltas-Wert für Y um denselben NEGATIV-Wert wie die Statusleiste bg height (beachte die Änderung in der iOS 6-Vorschau, wenn du sie verwendest):

Alternativen:

Um in Storyboard-lastigen Projekten noch weniger Code hinzuzufügen und den Hintergrund der Statusleiste automatisch zu drehen, anstatt einen Hintergrund für Ihre Statusleiste programmatisch hinzuzufügen, können Sie jedem View-Controller, der ganz oben in der Hauptansicht des View-Controllers sitzt, eine farbige Ansicht hinzufügen. Sie würden dann das Höhendelta dieser neuen Ansicht auf denselben negativen Wert wie die Höhe Ihrer Ansicht ändern (damit sie unter iOS 6 verschwindet).

Der Nachteil dieser Alternative (obwohl sie in Anbetracht der Autorotate-Kompatibilität vielleicht vernachlässigbar ist) ist die Tatsache, dass diese zusätzliche Ansicht nicht sofort sichtbar ist, wenn Sie Ihr Storyboard für iOS 6 betrachten. Sie würden nur wissen, dass es da ist, wenn Sie sich die " Document Outline "des Storyboards.


Ich habe Statusleiste wie iOS 6 in iOS 7 erreicht.

Setzen Sie UIViewControllerBasedStatusBarAppearance auf NO in info.plist

Pase diesen Code in - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions Methode

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);
}

Es kann alle Ihre Ansichten um 20 Pixel nach unten drücken. Um zu kommen, verwenden Sie folgenden Code in -(void)viewDidAppear:(BOOL)animated Methode

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

Sie müssen den Wert von windowHeight Userdefaults nach der Fensterzuordnung in didFinishLauncing-Methode wie festlegen

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"];

Ich habe viele viele, viele, viele und viele Tutorials gesehen, um dieses verflixte Problem zu beheben. Aber keiner von ihnen funktioniert! Hier ist meine Lösung, und es funktioniert für mich:

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

Die Logik ist einfach. Ich verschiebe alle Kinderansichten auf die self.view mit 20 Pixeln. Das ist alles. Dann wird der Screenshot genau wie bei iOS 6 angezeigt. Ich hasse die iOS7-Statusleiste! ~ "~


Lösung:

Setzen Sie es in Ihrem Viewcontroller oder in rootviewcontroller durch Überschreiben der Methode:

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }

Wenn Sie den Interface-Builder verwenden, versuchen Sie Folgendes:

In deiner XIB-Datei:

1) Wählen Sie die Hauptansicht und stellen Sie die Hintergrundfarbe auf Schwarz (oder in welcher Farbe auch immer die Statusleiste sein soll)

2) Stellen Sie sicher, dass der Hintergrund eine eigenständige Unteransicht ist, die als oberste Ebene der Ansicht des Controllers positioniert ist.
Bewegen Sie Ihren Hintergrund, um ein direkter Nachfolger der Ansicht des Controllers zu werden. Überprüfen Sie das Fenster für die automatische Größenanpassung, um sicherzustellen, dass Sie alle Rahmenkanten gesperrt und beide Flexibilitätsachsen aktiviert haben. Wenn dies eine UIImageView-Ansicht ist, legen Sie den Inhaltsmodus auf "Ausfüllen" fest. Programmgesteuert bedeutet dies, dass contentMode auf UIViewContentModeScaleToFill gesetzt ist und die Maske für die automatische Größenänderung auf (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight) gesetzt ist.

3) Nun verschiebe alles, was gesperrt ist, um 20 Punkte nach oben und setze ein iOS 6/7 Delta Y auf -20.
Alle Top-Level-Kinder, die im Autosizing-Panel an den obersten Frame gebunden sind, müssen um 20 Punkte nach unten verschoben werden und ihr iOS 6/7 Delta Y muss auf -20 gesetzt werden. (Cmd wählen Sie alle aus, und klicken Sie auf den Pfeil nach unten 20 Mal - gibt es einen besseren Weg, jemand?)

4) Passe die iOS 6/7-Delta-Höhe aller oben genannten Gegenstände an, die eine flexible Höhe hatten. Für alle Elemente, die oben und unten am Rahmen fixiert waren und die flexible Höhe im Bereich für die automatische Größeneinstellung aktiviert war, muss die Delta-Höhe für iOS 6/7 ebenfalls auf 20 eingestellt sein. Dies schließt die oben genannte Hintergrundansicht ein. Dies mag anti-intuitiv erscheinen, aber aufgrund der Reihenfolge, in der diese angewendet werden, ist es notwendig. Die Rahmenhöhe wird zuerst eingestellt (basierend auf dem Gerät), dann werden die Deltas angewendet und schließlich werden die Autosizing-Masken basierend auf den Offset-Positionen aller Kind-Frames angewendet - denke es für ein bisschen durch, es wird Sinn ergeben.

5) Schließlich brauchen Objekte, die am unteren Rahmen, aber nicht am oberen Rahmen befestigt sind, überhaupt keine Deltas.

Dadurch erhalten Sie die identische Statusleiste in iOS7 und iOS6.

Auf der anderen Seite, wenn Sie iOS7-Styling unter Beibehaltung der iOS6-Kompatibilität möchten, dann legen Sie die Delta Y / Delta Höhe Werte auf 0 für die Hintergrundansicht.

Um mehr Informationen zu iOS7-Migrationen zu erhalten, lesen Sie den vollständigen Beitrag: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html


Wenn Sie nicht möchten, dass Ihre View-Controller von der Statusleiste (und den Navigationsleisten) überlappt werden, deaktivieren Sie das Kontrollkästchen "Kanten unter den oberen Balken verlängern" im Interface Builder in Xcode 5.


Das könnte zu spät sein, um etwas zu teilen, aber ich habe etwas beizutragen, was jemandem helfen könnte. Ich habe versucht, die UINavigationBar zu unterteilen und wollte sie wie ios 6 mit schwarzer Statusleiste und Statusleiste in weiß aussehen lassen.

Hier ist, was ich dafür gefunden habe

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

Es hat meine Statusleiste schwarz, Statusleiste Text weiß und Navigationsleiste Farbe weiß gemacht.

iOS 9.3, XCode 7.3.1


I am late for this Answer, but i just want to share what i did, which is basically the easiest solution

First of all-> Go to your info.plist File and add Status Bar Style->Transparent Black Style(Alpha of 0.5)

Now ,here it Goes:-

Add this code in your AppDelegate.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;
   }

In order to continue working with setStatusBarHidden: I use this category:

@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

My solution was to add a UIView with height of 20 points on top of the window when on iOS 7. Then I created a method in my AppDelegate class to show/hide the "solid" status bar background. In 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;

Then I created a method to fade in/out the black status bar background:

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

All I have to do now is call is [appDelegate showSolidStatusBar:YES] when needed.


The easiest way to do so is installing an older SDK to your newest Xcode.

How to install older SDK to the newest Xcode?

  1. U can get the iOS 6.1 SDK from http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html or downloading an older Xcode and geting the SDK from its contents

  2. Unzip and paste this folder to /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs

  3. Restart the xcode.

  4. U can now select an older SDK on your project's build settings

Hoffe es hilft dir. It worked for me =)


This may be a overwhelming problem if you use Auto layout because you can not directly manipulate frames anymore. There is a simple solution without too much work.

I ended up writing an utility method in an Utility Class and called it from all the view controllers's viewDidLayoutSubviews Method.

+ (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];
        }
    }

Override your viewDidLayoutSubviews method in the view controller, where you want status bar. It will get you through the burden of Autolayout.

- (void)viewDidLayoutSubviews
{
    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    [super viewDidLayoutSubviews];
    [MyUtilityClass addStatusBarIfiOS7:self];
}

Probieren Sie diese einfache Methode ....

Schritt 1 : Um in EinzelansichtController zu viewController

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

Schritt 2 : Um die gesamte Anwendung zu ändern

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

Schritt 3 : viewWillAppear Sie dies auch in jedem viewWillAppear , um statusbar Höhe der iOS7 für 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];
    }