wake-up-neo.com

iOS 7-Statusleiste zurück zum iOS 6-Standardstil in der iPhone-App?

In iOS 7 wurde UIStatusBar so gestaltet, dass es mit der Ansicht wie folgt verschmilzt:

GUI designed by Tina Tavčar (GUI von Tina Tavčar )

  • Es ist cool, aber es wird Ihre Ansicht etwas durcheinander bringen, wenn Sie etwas im oberen Teil der Ansicht haben, und es überlappt sich mit der Statusleiste.

  • Gibt es eine einfache Lösung (z. B. das Festlegen einer Eigenschaft in info.plist), die die Funktionsweise [nicht überlappend] an iOS6 ändern kann? 

  • Ich weiß, dass eine einfachere Lösung darin besteht, self.view.center.x + 20 Punkte für jeden einzelnen View-Controller zu haben, aber wenn Sie sie ändern, werden andere Dimensionen verschraubt (ein anderer self.view.center.x kann zu Problemen bei benutzerdefinierten Abschnitten usw. führen) und plötzlich wird dies zu einem langwierigen Job das ist am besten zu vermeiden. 

  • Ich bin wirklich froh, wenn mir jemand eine Einzeilerlösung anbieten kann.

P.S. Ich weiß, dass ich die Statusleiste ausblenden kann, indem Sie Dinge wie Haben tun

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

In der didFinishLaunchingWithOptions-Methode, aber das ist eine Problemumgehung, eine Verknüpfung, die das Problem vermeidet, daher halte ich dies nicht für eine echte Lösung.

291
Archy Wilhes

Dies ist ein Cross-Posting aus einem Blogpost, den ich geschrieben habe , aber hier ist der vollständige Überblick über Statusleisten, Navigationsleisten und Containeransicht-Controller unter iOS 7:

  1. Es ist nicht möglich, das Layout der Statusleiste im Stil von iOS 6 beizubehalten. Die Statusleiste überlappt Ihre Anwendung immer unter iOS 7

  2. Verwechseln Sie die Darstellung der Statusleiste nicht mit dem Statusleisten-Layout. Das Erscheinungsbild (Licht oder Standard) hat keinen Einfluss auf die Anordnung der Statusleiste (Rahmen/Höhe/Überlappung). Beachten Sie auch, dass die Systemstatusleiste keine Hintergrundfarbe mehr hat. Wenn sich die API auf UIStatusBarStyleLightContent bezieht, bedeutet dies weißen Text auf klarem Hintergrund. UIStatusBarStyleDefault ist schwarzer Text auf einem klaren Hintergrund.

  3. Das Aussehen der Statusleiste wird über einen von zwei sich gegenseitig ausschließenden Basispfaden gesteuert: Sie können sie entweder wie gewohnt programmgesteuert festlegen oder UIKit aktualisiert das Erscheinungsbild für Sie basierend auf einigen neuen 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 Ansichts-Controller auf oberster Ebene in Ihrer App (mit Ausnahme eines Standard-UIKit-Container-View-Controllers) eine Voreinstellung von PreferredStatusBarStyle überschreiben, wobei entweder der Standard- oder der Lichtstil zurückgegeben wird. Wenn Sie den Plist-Wert in NO ändern, können Sie die Darstellung der Statusleiste mit den bekannten UIApplication-Methoden verwalten.

  4. UINavigationController ändert die Höhe seiner UINavigationBar entweder in 44 Punkte oder in 64 Punkte, abhängig von einer eher seltsamen und undokumentierten Einschränkung. Wenn der UINavigationController feststellt, dass der obere Teil des Rahmens seiner Ansicht visuell an das obere Ende des UIWindow angrenzt, zeichnet er seine Navigationsleiste mit einer Höhe von 64 Punkten. Wenn der obere Bereich der Ansicht nicht mit dem oberen Bereich des UIWindow verbunden ist (auch wenn nur ein Punkt deaktiviert ist), zeichnet er die Navigationsleiste auf "herkömmliche" Weise mit einer Höhe von 44 Punkten. Diese Logik wird von UINavigationController ausgeführt, auch wenn sich mehrere Kinder in der View Controller-Hierarchie Ihrer Anwendung befinden. Es gibt keine Möglichkeit, dieses Verhalten zu verhindern.

  5. Wenn Sie ein Hintergrundbild der benutzerdefinierten Navigationsleiste angeben, das nur 44 Punkte (88 Pixel) groß ist und die Grenzen der Ansicht des UINavigationController mit den Grenzen des UIWindow übereinstimmen (wie in # 4 erläutert), wird der UINavigationController Ihr Bild im Rahmen zeichnen (0,20,320) , 44), so dass 20 Punkte undurchsichtige schwarze Fläche über Ihrem benutzerdefinierten Bild verbleiben. Dies könnte Sie verwirren, weil Sie denken, Sie seien ein kluger Entwickler, der Regel Nr. 1 umgangen hat, aber Sie täuschen sich. Die Navigationsleiste ist immer noch 64 Punkte groß. Durch das Einbetten eines UINavigationControllers in eine Hierarchie der Darstellungsformen für Slide-to-Offenlegungen wird dies deutlich.

  6. Hüten Sie sich vor der verwirrend benannten edgeForExtendedLayout-Eigenschaft von UIViewController. Das Anpassen von edgeForExtendedLayout führt in den meisten Fällen zu nichts. UIKit verwendet diese Eigenschaft nur, wenn Sie einem UINavigationController einen Ansichtscontroller hinzufügen. Anschließend verwendet der UINavigationController die Funktion „edgeForExtendedLayout“, um zu bestimmen, ob der untergeordnete View-Controller unter dem Navigationsleisten-/Statusleistenbereich sichtbar sein soll oder nicht. Durch das Setzen von edgeForExtendedLayout auf dem UINavigationController selbst ändert sich nichts, ob der UINavigationController über einen 44 oder 64 Punkte hohen Navigationsleistenbereich verfügt. Siehe Nr. 4 für diese Logik. Eine ähnliche Layout-Logik gilt für den unteren Teil Ihrer Ansicht, wenn Sie eine Symbolleiste oder einen UITabBarController verwenden.

  7. Wenn Sie lediglich versuchen, zu verhindern, dass der benutzerdefinierte untergeordnete Ansichtscontroller die Navigationsleiste innerhalb eines UINavigationControllers unterläuft, setzen Sie den Wert für edgeForExtendedLayout auf UIRectEdgeNone (oder mindestens eine Maske, die UIRectEdgeTop ausschließt). Stellen Sie diesen Wert so früh wie möglich im Lebenszyklus Ihres View-Controllers ein.

  8. UINavigationController und UITabBarController versuchen auch, die contentInsets von Tabellensichten und Sammlungsansichten in ihrer Unteransichtshierarchie aufzufüllen. Dies geschieht auf ähnliche Weise wie die Statusleistenlogik von # 4. Es gibt eine programmatische Möglichkeit, dies zu verhindern, indem Sie automatischScrollViewInsets für Ihre Tabellen- und Auflistungsansichten auf NO setzen (Standardeinstellung ist YES). Dies stellte einige ernsthafte Probleme für Whisper und Riposte dar, da wir mit contentInset-Anpassungen das Layout von Tabellensichten als Reaktion auf Symbolleisten- und Tastaturbewegungen steuern.

  9. Um es noch einmal zu wiederholen: Es gibt keine Möglichkeit, zur Layout-Logik der Statusleiste im Stil von iOS 6 zurückzukehren. Um dies zu approximieren, müssen Sie alle View-Controller Ihrer App in eine Containeransicht verschieben, die um 20 Punkte vom oberen Rand des Bildschirms versetzt ist. Hinter der Statusleiste ist eine absichtlich schwarze Ansicht, um das alte Erscheinungsbild zu simulieren. Dies ist die Methode, die wir in Riposte und Whisper verwendet haben.Apple bemüht sich sehr, sicherzustellen, dass Sie nicht versuchen, # 9 auszuführen. Sie möchten, dass wir alle unsere Apps so umgestalten, dass die Statusleiste unterlegt wird. Es gibt viele zwingende Argumente, jedoch sowohl aus Benutzererfahrung als auch aus technischen Gründen, warum dies nicht immer eine gute Idee ist. Sie sollten das Beste für Ihre Benutzer tun und nicht einfach den Launen der Plattform folgen.

  10. Apple is pushing very hard to ensure that you don’t try to do #9. They want us to redesign all our apps to underlap the status bar. There are many cogent arguments, however, for both user experience and technical reasons, why this is not always a good idea. You should do what is best for your users and not simply follow the whimsy of the platform.

450
jaredsinclair

Updates am 19. September 2013:

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

korrigierte Tippfehler in der Anweisung NSNotificationCenter


Updates am 12. September 2013:

UIViewControllerBasedStatusBarAppearance zu NO korrigiert

fügte eine Lösung für Apps mit Bildschirmrotation hinzu

es wurde ein Ansatz hinzugefügt, um die Hintergrundfarbe der Statusleiste zu ändern.


Es gibt anscheinend keine Möglichkeit, die iOS7-Statusleiste auf die Funktionsweise von iOS6 zurückzusetzen.

Wir können jedoch immer einige Codes schreiben und die Statusleiste in iOS6-ähnliches Format umwandeln. Dies ist der kürzeste Weg, den ich finden kann:

  1. Setzen Sie UIViewControllerBasedStatusBarAppearance in info.plist auf NO (Um zu verhindern, dass Ansichtscontroller den Statusleistenstil anpassen, können Sie den Statusleistenstil mithilfe der UIApplicationstatusBarStyle-Methode festlegen.)

  2. Rufen Sie in AppDelegates application:didFinishLaunchingWithOptions auf

    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;
    


damit:

  1. Überprüfen Sie, ob es sich um iOS 7 handelt.

  2. Legen Sie fest, dass der Inhalt der Statusleiste im Gegensatz zu UIStatusBarStyleDefault weiß ist.

  3. Vermeiden Sie, dass Unteransichten angezeigt werden, deren Rahmen über die sichtbaren Grenzen hinausragen (für Ansichten, die von oben in die Hauptansicht animiert werden).

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


Für Apps mit Bildschirmdrehung

verwenden Sie NSNotificationCenter, um Orientierungsänderungen durch Hinzufügen zu erkennen

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

in if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) und erstelle 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 (Hochformat, Auf dem Kopf stehend, Querformat links oder Querformat rechts) zu erkennen und den Fensterrahmen der App zu ändern, um die Illusion der iOS 6-Statusleiste zu erstellen.


So ändern Sie die Hintergrundfarbe Ihrer Statusleiste:

Hinzufügen

 @property (retain, nonatomic) UIWindow *background;

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

Danach müssen Sie nur noch das UIWindow in if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) erstellen:

background = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, self.window.frame.size.width, 20)];
background.backgroundColor =[UIColor redColor];
[background setHidden:NO];

Vergiss nicht, @synthesize background; nach @implementation AppDelegate zu wiederholen!

122
Archy Will He

UPDATE (NEUE LÖSUNG) 

Dieses Update ist die beste Lösung für das Problem der iOS 7-Navigationsleiste. Sie können ein Farbbeispiel 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 Image

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 dies ist beim Öffnen mit iOS 6; es beginnt bei 0 Pixel.

Hinweis: iOS 6/7-Deltas werden nur angezeigt, wenn Sie "View Autolayout" für den View Controller im "Dateiinspektor" (Symbol ganz links) im Detailbereich deaktivieren.

Enter image description here

40

LÖSUNG:

Legen Sie es in Ihrem Viewcontroller oder im Rootviewcontroller fest, indem Sie die Methode überschreiben:

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }
26
dave

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

TOR:

Ziel dieses Ansatzes ist es, den gleichen Statusleistenstil in iOS7 wie in iOS6 neu zu erstellen (siehe Titel der Frage "Statusanzeige für iOS 7 zurück zu iOS 6?").

ZUSAMMENFASSUNG:

Um dies zu erreichen, verwenden wir das Storyboard so weit wie möglich, indem wir Benutzeroberflächenelemente, die von der Statusleiste (unter iOS 7) überlappt werden, nach unten verschieben, während Sie mit Deltas die nach unten gerichtete Layoutänderung für iOS 6.1 oder früher rückgängig machen. Der dadurch entstehende zusätzliche Platz in iOS 7 wird dann von einem UIView belegt, wobei backgroundColor auf eine Farbe unserer Wahl gesetzt ist. Letzteres kann in Code oder mithilfe des Storyboards erstellt werden (siehe ALTERNATIVEN unten).

ANNAHMEN:

Um das gewünschte Ergebnis zu erhalten, wenn Sie die folgenden Schritte ausführen, wird davon ausgegangen, dass View controller-based status bar appearance auf NO gesetzt ist und dass Ihr Status bar style entweder auf "Transparent Black Style (Alpha of 0.5)" oder "Opake Black Style" eingestellt ist. Beide Einstellungen finden Sie unter "Info" in Ihren Projekteinstellungen.

SCHRITTE:

  • Fügen Sie dem UIWindow eine Unteransicht hinzu, die als Hintergrund für die Statusleiste dient. Um dies zu erreichen, fügen Sie dem application: didFinishLaunchingWithOptions: Ihrer AppDelegate nach makeKeyAndVisible Folgendes hinzu:

    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 programmgesteuert NUR für iOS 7 einen Hintergrund hinzugefügt haben, müssen Sie das Layout Ihrer Benutzeroberflächenelemente anpassen, die von der Statusleiste überlappt werden, während das Layout für iOS6 beibehalten wird. Um dies zu erreichen, gehen Sie wie folgt vor:

    • Stellen Sie sicher, dass Use Autolayout für Ihr Storyboard nicht markiert ist (da ansonsten "iOS 6/7 Deltas" nicht im Größeninspektor angezeigt wird). Um dies zu tun:
      • wählen Sie Ihre Storyboard-Datei aus
      • dienstprogramme anzeigen
      • wählen Sie "Dateiinspektor anzeigen".
      • Deaktivieren Sie unter "Interface Builder Document" die Option "Autolayout verwenden".
    • Um die Layoutänderungen für iOS 7 UND 6 während der Anwendung zu überwachen, wählen Sie optional den "Assistenten-Editor" und dann "Vorschau" und "iOS 6.1 oder früher": enter image description hereenter image description here
    • Wählen Sie nun das Benutzeroberflächenelement aus, das Sie anpassen möchten, damit es nicht mehr von der Statusleiste überlappt wird
    • Wählen Sie in der Spalte "Dienstprogramme" die Option "Größeninspektor anzeigen"
    • Positionieren Sie Ihr UI-Element entlang der Y-Achse um den gleichen Betrag wie die Höhe der Statusleiste bg: enter image description here
    • Und ändern Sie den iOS6/7-Deltas-Wert für Y um den gleichen NEGATIVEN Betrag wie die Höhe der Statusleiste bg (Beachten Sie die Änderung in der iOS 6-Vorschau, falls Sie diese verwenden): enter image description here

ALTERNATIVEN:

Um in Storyboard-schweren Projekten noch weniger Code hinzuzufügen und den Statusbar-Hintergrund automatisch zu automatisieren, anstatt programmgesteuert einen Hintergrund für die Statusleiste hinzuzufügen, können Sie jedem Ansichtscontroller, der sich ganz oben in der Hauptansicht des Viewcontrollers befindet, eine farbige Ansicht hinzufügen. Sie würden dann das Höhen-Delta dieser neuen Ansicht auf den gleichen negativen Wert wie die Höhe Ihrer Ansicht ändern (damit sie unter iOS 6 nicht mehr angezeigt wird).

Der Nachteil dieser Alternative (wenngleich die Autorotate-Kompatibilität möglicherweise vernachlässigbar ist) ist die Tatsache, dass diese zusätzliche Ansicht nicht sofort sichtbar ist, wenn Sie Ihr Storyboard für iOS 6 anzeigen. Sie würden nur wissen, dass sie da ist, wenn Sie sich das " Dokumententwurf "des Storyboards.

17
svrs

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

Uncheck the Extend Edges Under Top Bars

12
nvrtd frst

Apple veröffentlicht Technische Fragen und Antworten QA1797: Verhindern, dass die Statusleiste Ihre Ansichten überdeckt. Es funktioniert gut für die Versionen iOS 6 und iOS 7.

11
Igor

Ich habe viele, viele, viele und viele Tutorials angesehen, um dieses verdammte 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. Der Screenshot wird dann wie bei iOS 6 angezeigt. Ich hasse die Statusleiste von iOS7! ~ "~

8
firestoke

Eine kleine Alternative zu Archy Holts Antwort, etwas einfacher:

ein. Setzen Sie UIViewControllerBasedStatusBarAppearance in info.plist auf NO

b. Rufen Sie in AppDelegates application:didFinishLaunchingWithOptions: Folgendes auf:

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 die Unterklasse UIWindow berücksichtigen, um UIApplicationDidChangeStatusBarOrientationNotification selbst zu behandeln. 

6
Cœur

Ich habe dies in allen meinen View-Controllern verwendet, es ist einfach ... __ Fügen Sie diese Zeilen in alle Ihre viewDidLoad-Methoden ein:

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

    [super viewDidLoad];
}
5
IgniteCoders

 

Probieren Sie diese einfache Methode aus ....

Schritt 1 : Um in single viewController zu wechseln

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

Schritt 2 : In der gesamten Anwendung ändern

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

Schritt 3 : Füge dies auch in jedem viewWillAppear hinzu, um die statusbar Höhe für iOS7 anzupassen

    [[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
svmrajesh

Ich habe eine Statusleiste wie iOS 6 in iOS 7 erreicht.

Setzen Sie UIViewControllerBasedStatusBarAppearance in info.plist auf NO

Pase diesen Code in der - (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);
}

Möglicherweise drücken Sie alle Ihre Ansichten um 20 Pixel. Um das zu erreichen, verwenden Sie folgenden Code in der -(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 für windowHeight Userdefaults nach der Fensterzuordnung in der didFinishLauncing-Methode wie einstellen 

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

Im Interface Builder gibt es eine Option, die die Eigenschaft iOS 6/7 Delta aufruft, mit der das Offset-Problem gelöst werden soll.

Sehen Sie sich die Frage in Stack Overflow-Frage an INTERFACE BUILDER: WOZU DIENT DAS UIVIEW-LAYOUT IOS 6/7 DELTAS?.

3

Wenn Sie den Interface Builder verwenden, versuchen Sie Folgendes:

In Ihrer xib-Datei:

1) Wählen Sie die Hauptansicht aus und setzen Sie die Hintergrundfarbe auf Schwarz (oder welche Farbe die Statusleiste haben soll).

2) Stellen Sie sicher, dass der Hintergrund eine eigenständige Unteransicht ist, die als untergeordnetes Element der Controller-Ansicht auf oberster Ebene positioniert ist.
Verschieben Sie Ihren Hintergrund, um ein direktes Kind 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 es sich um eine UIImageView handelt, setzen Sie den Inhaltsmodus auf „Zum Füllen skalieren“. Programmatisch bedeutet dies, dass contentMode auf UIViewContentModeScaleToFill festgelegt ist und die Maske für die automatische Größenänderung auf (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight) festgelegt ist.

3) Verschieben Sie nun alles, was gesperrt ist, um 20 Punkte nach oben - unten und setzen Sie ein iOS 6/7 Delta Y auf -20.
Alle untergeordneten Elemente der obersten Ebene, die im Fenster für die automatische Größenanpassung mit dem oberen Frame verbunden sind, müssen um 20 Punkte nach unten verschoben werden, und das Delta Y für iOS 6/7 muss auf -20 eingestellt sein. (Wählt alle aus und klickt 20 Mal auf den Pfeil nach unten - gibt es einen besseren Weg für jemanden?)

4) Passen Sie die Delta-Höhe von iOS 6/7 für alle oben genannten Elemente an, die eine flexible Höhe hatten. Alle Elemente, die an den Rahmen gebunden waren oben und unten und mit aktivierter flexibler Höhe im Autosizing-Bereich muss auch die Delta-Höhe für iOS 6/7 auf 20 eingestellt sein. Dies schließt die oben erwähnte Hintergrundansicht ein. Dies mag als nicht intuitiv erscheinen, ist jedoch aufgrund der Reihenfolge, in der diese angewendet werden, erforderlich. Die Rahmenhöhe wird zuerst festgelegt (basierend auf dem Gerät), dann werden die Deltas angewendet und schließlich werden die Autosizing-Masken basierend auf den Versatzpositionen aller untergeordneten Rahmen angewendet - überlegen Sie es sich ein wenig, es ist sinnvoll.

5) Schließlich benötigen Elemente, die am unteren Rahmen, aber nicht am oberen Rahmen verriegelt waren, überhaupt keine Deltas.

Das gibt Ihnen die identische Statusleiste in iOS7 und iOS6.

Wenn Sie dagegen iOS7-Styling möchten, während die iOS6-Kompatibilität erhalten bleibt, setzen Sie die Werte für Delta Y/Delta Height für die Hintergrundansicht auf 0.

Weitere Informationen zur iOS7-Migration finden Sie im vollständigen Beitrag: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html

2
thebman

Dies kann ein überwältigendes Problem sein, wenn Sie das automatische Layout verwenden, da Sie Frames nicht mehr direkt bearbeiten können. Es gibt eine einfache Lösung ohne zu viel Arbeit.

Am Ende schrieb ich eine Utility-Methode in einer Utility-Klasse und rief sie von allen viewDidLayoutSubviews-Methoden der View-Controller auf.

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

Überschreiben Sie Ihre viewDidLayoutSubviews-Methode im View-Controller, wo Sie die Statusleiste haben möchten. Es wird Sie durch die Last von Autolayout bringen.

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

Meine Lösung bestand darin, auf iOS 7 ein UIView mit einer Höhe von 20 Punkten über dem Fenster hinzuzufügen. Dann habe ich in meiner AppDelegate-Klasse eine Methode erstellt, um den Hintergrund der "durchgehenden" Statusleiste anzuzeigen/auszublenden. 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;

Dann habe ich eine Methode erstellt, um den schwarzen Hintergrund der Statusleiste ein- und auszublenden:

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

Jetzt muss ich nur noch [appDelegate showSolidStatusBar:YES] anrufen, wenn nötig.

2
Alexandre OS

Am einfachsten ist es, ein älteres SDK auf Ihrem neuesten Xcode zu installieren.

Wie installiere ich älteres SDK auf den neuesten Xcode?

  1. Sie können das iOS 6.1-SDK von http://www.4shared.com/Zip/NlPgsxz6/iPhoneOS61sdk.html herunterladen oder einen älteren Xcode herunterladen und das SDK aus dem Inhalt abrufen

  2. Entpacken Sie diesen Ordner und fügen Sie ihn in /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs ein

  3. Starten Sie den Xcode neu.

  4. Sie können jetzt ein älteres SDK in den Build-Einstellungen Ihres Projekts auswählen

Ich hoffe es hilft dir. Es hat für mich funktioniert =)

1
marcelosalloum

Ich komme zu spät für diese Antwort, aber ich möchte nur mitteilen, was ich getan habe, was im Grunde die einfachste Lösung ist

Zuallererst-> Gehen Sie zu Ihrer info.plist-Datei und fügen Sie Statusleistenstil-> Transparenter Schwarzstil hinzu (Alpha von 0,5)

Nun, hier geht es: -

Füge diesen Code in AppDelegate.m ein

- (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
Vizllx

Bei der Verwendung von presentViewController:animated:completion: durch den window.rootViewController.view musste ich einen anderen Ansatz für dieses Problem finden. Ich habe es endlich mit Modalen und Rotationen arbeiten lassen, indem ich die UIView meines rootViewControllers subclassing.

.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

Sie haben jetzt eine starke Lösung für iOS7-Animationen.

1
Cœur

Dies könnte zu spät sein, um mitzuteilen, aber ich habe etwas beizutragen, das jemandem helfen könnte. Ich habe versucht, die UINavigationBar-Klasse zu unterteilen, und wollte, dass es wie ios 6 aussieht.

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()

Der Hintergrund der Statusleiste wurde schwarz, der Text der Statusleiste und die Farbe der Navigationsleiste weiß.

iOS 9.3, XCode 7.3.1

0
channi

Um mit setStatusBarHidden weiterzuarbeiten, verwende ich diese Kategorie:

@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
Tomer Even

Meine sehr einfache Lösung (vorausgesetzt, Sie haben nur die vertikale Ausrichtung unterstützt) besteht darin, Anwendungsfenstergrenzen für iOS-Versionen unter 7 neu zu definieren.

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
jki

Sie können die Statusleiste alle zusammen ausblenden. Ihre App wird also im Vollbildmodus angezeigt. Ich denke, das ist das Beste, was Sie bekommen werden.

UIStatusBarStyleNone oder in den Zieleinstellungen festgelegt.

0
Christopher Rex

Schritte für Ausblenden der Statusleiste in iOS 7:

1.Gehen Sie zu Ihrer Anwendungsinfo.plist-Datei.

2. Und Set, Anzeige der Controller-basierten Statusleiste: Boolean NO 

Hoffe, ich habe das Problem mit der Statusleiste gelöst ...

0
chandrika

Ich habe hier die besten Alternativen und Lösungen für dieses Problem mit der Navigationsleiste in iOS7 gefunden !!

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

Ich hoffe, dass damit alle Fragen und Sorgen geklärt werden. 

0
simbesi.com