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

292

In iOS 7 wurde das UIStatusBarso gestaltet, dass es mit der folgenden Ansicht verschmilzt:

GUI von Tina Tavčar entworfen (GUI entworfen von Tina Tavčar )

  • Es ist cool, aber es wird Ihre Ansicht etwas durcheinander bringen, 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), mit der sich die Funktionsweise [nicht überlappend] wieder in iOS6 ändern lässt?

  • Ich weiß, dass eine einfachere Lösung darin besteht, self.view.center.x+ 20 Punkte für jeden einzelnen Ansichts-Controller zu haben, aber wenn Sie diese ändern, werden andere Dimensionen durcheinander gebracht (ein anderes self.view.center.xkann zu Problemen bei benutzerdefinierten Abschnitten usw. führen), und plötzlich wird dies zu einer mühsamen Aufgabe am besten vermieden werden.

  • Ich bin wirklich froh, wenn mir jemand eine Einzeiler-Lösung dafür anbieten kann.

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

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

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

Y 奇 说 - 何魏奇 Archy Will He
quelle
6
Leider wurden schwarze Statusleisten in ios 7
i_duhh_bomb
Ich werde @GangstaGraham zustimmen. Diese Farben sind einfach wunderschön ! Um Ihre Frage zu beantworten, können Sie leider nicht. Der Grund, warum die Statusleiste jetzt so gestaltet ist, ist, dass Transluzenz das neue iOS-Ding ist und einer Anwendung "Tiefe" verleiht, indem sie sagt, dass sie über etwas liegt, sodass sich etwas darunter befindet.
Cole Johnson
Haben Sie versucht, PreferredStatusBarStyle auf UIStatusBarDefault zu setzen? Kasse iOS 7 UIViewController Dokumentation
theaob
1
Wenn Sie UIStatusBarDefaultfür die Statusleiste haben, wird der Inhalt nur schwarz. Es wird nicht so funktionieren, wie es in iOS6 funktioniert.
吖 奇 说 - 何魏奇 Archy Will He
2
Hast du Glück damit? Ich liebe iOS7, aber dieses Ding macht mich verrückt!
Mihai Fratu

Antworten:

449

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

  1. Es gibt keine Möglichkeit, das Layout der Statusleiste im iOS 6-Stil beizubehalten. Die Statusleiste überlappt Ihre Anwendung unter iOS 7 immer

  2. Verwechseln Sie das Erscheinungsbild der Statusleiste nicht mit dem Layout der Statusleiste. Das Erscheinungsbild (hell oder standardmäßig) hat keinen Einfluss darauf, wie die Statusleiste angeordnet ist (Rahmen / Höhe / Überlappung). Es ist auch wichtig zu beachten, dass die Systemstatusleiste keine Hintergrundfarbe mehr hat. Wenn die API auf UIStatusBarStyleLightContent verweist, bedeutet dies weißen Text auf klarem Hintergrund. UIStatusBarStyleDefault ist schwarzer Text auf klarem Hintergrund.

  3. Das Erscheinungsbild der Statusleiste wird über einen von zwei sich gegenseitig ausschließenden Basispfaden gesteuert: Sie können diese entweder auf herkömmliche Weise 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 auf "ViewController-basiertes Erscheinungsbild der Statusleiste", um festzustellen, welchen Sie verwenden. Wenn Sie diesen Wert auf YES setzen, muss jeder Ansichts-Controller der obersten Ebene in Ihrer App (außer einem Standard-UIKit-Container-Ansichts-Controller) den bevorzugten StatusBarStyle überschreiben und entweder den Standard- oder den Lichtstil zurückgeben. Wenn Sie den Plist-Wert auf NO bearbeiten, können Sie das Erscheinungsbild der Statusleiste mithilfe der bekannten UIApplication-Methoden verwalten.

  4. UINavigationController ändert die Höhe seiner UINavigationBar auf 44 Punkte oder 64 Punkte, abhängig von einer ziemlich seltsamen und nicht dokumentierten Reihe von Einschränkungen. Wenn der UINavigationController erkennt, dass der obere Rand des Ansichtsrahmens visuell an den oberen Rand des UIWindow angrenzt, zeichnet er die Navigationsleiste mit einer Höhe von 64 Punkten. Wenn die Oberseite der Ansicht nicht an die Oberseite des UIWindow angrenzt (auch wenn sie nur um einen Punkt abweicht), zeichnet sie die Navigationsleiste auf „traditionelle“ Weise mit einer Höhe von 44 Punkten. Diese Logik wird von UINavigationController ausgeführt, auch 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 Hintergrundbild für eine benutzerdefinierte Navigationsleiste mit einer Höhe von nur 44 Punkten (88 Pixel) angeben und die Grenzen der Ansicht des UINavigationControllers mit den Grenzen des UIWindow übereinstimmen (wie in Nr. 4 erläutert), zeichnet der UINavigationController Ihr Bild in den Rahmen (0,20,320) , 44), wobei 20 Punkte undurchsichtigen schwarzen Bereichs über Ihrem benutzerdefinierten Bild verbleiben. Dies kann Sie verwirren, wenn Sie glauben, ein kluger Entwickler zu sein, der Regel 1 umgangen hat, aber Sie irren sich. Die Navigationsleiste ist immer noch 64 Punkte hoch. Das Einbetten eines UINavigationControllers in eine Hierarchie der Folienansicht macht dies sehr deutlich.

  6. Beachten Sie die verwirrend benannten Kanten .ForExtendedLayout-Eigenschaft von UIViewController. Das Anpassen von KantenForExtendedLayout führt in den meisten Fällen zu nichts. UIKit verwendet diese Eigenschaft nur, wenn Sie einem UINavigationController einen Ansichts-Controller hinzufügen. Der UINavigationController verwendet KantenForExtendedLayout, um zu bestimmen, ob der untergeordnete Ansichts-Controller unter der Navigationsleiste / dem Statusleistenbereich sichtbar sein soll. Das Festlegen von KantenForExtendedLayout auf dem UINavigationController selbst ändert nichts daran, ob der UINavigationController über einen Navigationsleistenbereich mit einer Höhe von 44 oder 64 Punkten verfügt. Siehe # 4 für diese Logik. Eine ähnliche Layoutlogik gilt für den unteren Bereich Ihrer Ansicht, wenn Sie eine Symbolleiste oder einen UITabBarController verwenden.

  7. Wenn Sie lediglich verhindern möchten, dass Ihr benutzerdefinierter untergeordneter Ansichtscontroller die Navigationsleiste in einem UINavigationController überlappt, setzen Sie edgeForExtendedLayout auf UIRectEdgeNone (oder zumindest auf 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 Tabellenansichten und Sammlungsansichten in ihrer Unteransichtshierarchie aufzufüllen. Dies geschieht ähnlich wie in der Statusleistenlogik von # 4. Es gibt eine programmatische Möglichkeit, dies zu verhindern, indem für Ihre Tabellenansichten und Sammlungsansichten automatischAdjustsScrollViewInsets auf NO gesetzt wird (standardmäßig YES). Dies stellte Whisper und Riposte vor einige ernsthafte Probleme, da wir contentInset-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, zur Layoutlogik der Statusleiste im iOS 6-Stil zurückzukehren. Um dies zu approximieren, müssen Sie alle Ansichtscontroller Ihrer App in eine Containeransicht verschieben, die um 20 Punkte vom oberen Bildschirmrand versetzt ist. Hinter der Statusleiste bleibt eine absichtlich schwarze Ansicht, um das alte Erscheinungsbild zu simulieren. Dies ist die Methode, die wir in Riposte und Whisper angewendet haben.

  10. Apple ist sehr bemüht, sicherzustellen, dass Sie nicht versuchen, # 9 zu tun. Sie möchten, dass wir alle unsere Apps neu gestalten, um die Statusleiste zu unterstreichen. Es gibt jedoch viele überzeugende Argumente, sowohl aus Gründen der Benutzererfahrung als auch aus technischen Gründen, 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.

jaredsinclair
quelle
35
Ich wollte nur hinzufügen, dass Sie eine Einschränkung zu dem hinzufügen können, was sich oben in Ihrer Ansicht befindet, um an die obere Layout-Anleitung angehängt zu werden. Dadurch bleibt hinter der Statusleiste ein Leerzeichen (das Sie mit der gewünschten Farbe ausfüllen können). Außerdem kann die Ansicht auch in iOS 6 automatisch an die richtige Position angepasst werden. Auf diese Weise müssen Sie die Position Ihrer Ansichten im Code nicht manuell anpassen.
BreadicalMD
4
Das ist eine brillante Lösung. Sie haben meine Unwissenheit über AutoLayout aufgedeckt. Mach das besser.
Jaredsinclair
1
Wenn Sie den oberen Bereich Ihres Objekts unter dem Rand der oberen Layout-Anleitung platzieren, können Sie mit dem Einschränkungssteuerelement dem nächsten Nachbarn eine vertikale Abstandsbeschränkung hinzufügen, die nun die obere Layout-Anleitung ist. Alternativ können Sie bei gedrückter Strg-Taste von Ihrem Objekt zur oberen Layout-Anleitung eine vertikale Abstandsbeschränkung explizit hinzufügen.
BreadicalMD
2
@BreadicalMD Ein Teil, den ich nicht verstehe, ist, dass -topLayoutGuide unter iOS 6 nicht verfügbar ist. Bedeutet dies, dass Sie unter iOS 7 und 6 unterschiedliche Einschränkungen für das automatische Layout verwenden müssen?
Jeremy
1
Tolle Antwort ... Aber ich habe einen Zweifel 1) UINavigationController ändert den Höhenbereich. Bitte erklären Sie es etwas mehr. danke
user1010819
122

Updates am 19. September 2013:

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

Tippfehler in der NSNotificationCenterAnweisung korrigiert


Updates am 12. September 2013:

korrigiert UIViewControllerBasedStatusBarAppearanceaufNO

Es wurde eine Lösung für Apps mit Bildschirmrotation hinzugefügt

Es wurde ein Ansatz zum Ändern der Hintergrundfarbe der Statusleiste hinzugefügt.


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

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

  1. Setzen Sie UIViewControllerBasedStatusBarAppearanceauf NOin info.plist(Um Opt - out der mit View - Controller die Statusleiste Stil anpassen , so dass wir die Statusleiste Stil unter Verwendung des UIApplicationstatusBarStyle Verfahren eingestellt werden.)

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


damit:

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

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

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

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


Für Apps mit Bildschirmrotation

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 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 (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 erzeugen.


So ändern Sie die Hintergrundfarbe Ihrer Statusleiste:

Hinzufügen

 @property (retain, nonatomic) UIWindow *background;

in , AppDelegate.hum backgroundeine Eigenschaft in der Klasse und zu verhindern , ARC aus ausplanen es. (Sie müssen es nicht tun, wenn Sie ARC nicht verwenden.)

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

Vergiss nicht @synthesize background;danach @implementation AppDelegate!

Y 奇 说 - 何魏奇 Archy Will He
quelle
3
Dies bricht bei Rotation. Nur ein Kopf hoch
Jesse Naugher
2
@JesseNaugher Ich empfehle, die vertikale Abstandsbeschränkung programmgesteuert von 0 auf 20 zu ändern. Es wird auf Rotation arbeiten.
Experte
2
Haben Sie eine Idee, wie wir vermeiden können, dass die Navigationsleiste um 20 Pixel erweitert wird? Diese Lösung ist in Ordnung für mich, aber meine Navigationsleiste ist 20 Pixel zu hoch.
Simonbs
4
@ArchyHolt: Ihre einfache Lösung funktioniert für mich nur, wenn ich einen Modal View Controller vorstelle. Sobald der Modal View Controller geschlossen wurde, befindet sich die verbleibende Ansicht in der Statusleiste. Ich habe dies in einem neuen Beispielprojekt reproduziert, um sicherzustellen, dass nichts anderes funky los ist. Ich denke, vielleicht könnte Ihre fortschrittlichere Lösung hier nützlich sein, bin mir aber nicht sicher, welche Benachrichtigung ins Spiel kommen würde. Irgendwelche Ideen?
Markdorison
4
Die Ansicht wird zurückgesetzt, nachdem ein modaler Ansichtscontroller geschlossen wurde. :(
KarenAnne
41

UPDATE (NEUE LÖSUNG)

Dieses Update ist die beste Lösung für das Problem mit 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 den folgenden Code und das folgende Bild

Dies ist eine alte Version der Navigationsleistenlösung für iOS 7.

Ich habe das Problem mit dem folgenden Code gelöst. Dies dient 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];
}

Für Interface Builder gilt dies, wenn Sie mit iOS 6 öffnen. es beginnt bei 0 Pixel.

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

Geben Sie hier die Bildbeschreibung ein

İbrahim Özbölük
quelle
6
Du hast meinen Tag gemacht. Nimm +1 für die Hilfe!
Niru Mukund Shah
5
Bitte beachten Sie: iOS 6/7 Deltas werden nur angezeigt, wenn Sie im Detailbereich "Dateiinspektor" (Symbol ganz links) für "View Autolayout" für den View Controller deaktivieren.
Matt
1
Vielen Dank! Du hast mir viel Ärger erspart!
Neowinston
2
Wer sagte, dass das Layout der Statusleiste im iOS 6-Stil nicht beibehalten werden kann? Sie können dies per @ TacettinÖzbölük tun ... danke Kumpel für diese großartige Lösung.
Vizllx
1
Schön! Um Apple zu beachten, bevorzugen Sie dies jetzt: if (NSFoundationVersionNumber> = NSFoundationVersionNumber_iOS_6_1) {}
Joel Balmer
26

LÖSUNG:

Stellen Sie es in Ihrem Viewcontroller oder im Rootviewcontroller ein, indem Sie die Methode überschreiben:

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }
Dave
quelle
Keine schlechte Lösung. Entfernen Sie die Stange vollständig. Möglicherweise nicht immer ideal für UX, aber funktionsfähig.
Farhan Hafeez
Einfach toll. Arbeitete für mich einwandfrei.
MadLokesh
Szenario: Sobald ich nach der Wiedergabe des Videos im Vollbildmodus wieder zu meinem UIVIew wechsle, wird unten ein schwarzer Balken angezeigt, der nur der Größe der Statusleiste entspricht, obwohl ich bereits eine Statusleiste verwendet habe. Ich habe die Statusleiste komplett entfernt und jetzt ist das Problem behoben.
MadLokesh
Ich war nur mit dieser Methode erfolgreich
user2277872
17

Hier ein weiterer Ansatz für Projekte, die das Storyboard in großem Umfang nutzen:

TOR:

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

ZUSAMMENFASSUNG:

Um dies zu erreichen, verwenden wir das Storyboard so oft wie möglich, indem wir UI-Elemente, die von der Statusleiste (unter iOS 7) überlappt werden, nach unten verschieben und Deltas verwenden, um die nach unten gerichtete Layoutänderung für iOS 6.1 oder früher rückgängig zu machen. Der resultierende zusätzliche Speicherplatz in iOS 7 wird dann von einer UIView belegt, wobei die Hintergrundfarbe auf eine Farbe unserer Wahl eingestellt ist. Letzteres kann im Code oder mithilfe des Storyboards erstellt werden (siehe ALTERNATIVEN unten).

ANNAHMEN:

Um das gewünschte Ergebnis zu erzielen, wenn Sie die folgenden Schritte ausführen, wird davon ausgegangen, dass View controller-based status bar appearanceNO eingestellt ist und dass Status bar styleentweder "Transparenter schwarzer Stil (Alpha von 0,5)" oder "Opaker schwarzer Stil" eingestellt ist. Beide Einstellungen finden Sie in Ihren Projekteinstellungen unter "Info".

SCHRITTE:

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

    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 für iOS 7 programmgesteuert einen Hintergrund hinzugefügt haben, müssen Sie das Layout Ihrer UI-Elemente, die von der Statusleiste überlappt werden, entsprechend anpassen, während das Layout für iOS6 beibehalten wird. Gehen Sie dazu folgendermaßen vor:

    • Stellen Sie sicher, dass Use Autolayoutdas Kontrollkästchen für Ihr Storyboard deaktiviert ist (dies liegt daran, dass ansonsten "iOS 6/7 Deltas" im Größeninspektor nicht 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-Dokument" das Kontrollkästchen "Autolayout verwenden".
    • Wählen Sie optional den "Assistenten-Editor", "Vorschau" und "iOS 6.1 oder früher", um die Layoutänderungen für iOS 7 UND 6 beim Anwenden zu überwachen: Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein
    • Wählen Sie nun das UI-Element aus, das Sie anpassen möchten, damit 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 Höhe der Statusleiste: Geben Sie hier die Bildbeschreibung ein
    • Ändern Sie den iOS6 / 7-Deltas-Wert für Y um denselben NEGATIVEN Betrag wie die Höhe der Statusleiste (Beachten Sie die Änderung in der iOS 6-Vorschau, wenn Sie sie verwenden): Geben Sie hier die Bildbeschreibung ein

ALTERNATIVEN:

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

Der Nachteil dieser Alternative (obwohl sie angesichts der Kompatibilität mit Autorotaten 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 vorhanden ist, wenn Sie sich das " Dokumentumriss "des Storyboards.

sts2055
quelle
12

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

Deaktivieren Sie die Option Kanten unter den oberen Balken verlängern

nvrtd frst
quelle
7
Dies ist nur möglich, wenn Sie ein Storyboard verwenden
Cœur
3
Es funktioniert nur mit Containern vcs wie Navigations-Controller oder Tabbar-Controller
Andrea
2
KantenForExtendedLayout wird nur von Containersicht-Controllern (wie UINavigationController) verwendet, um zu bestimmen, ob die Ansichten der Kinder vom Chrome der Eltern überlappt werden sollen. Das Festlegen dieser Eigenschaft auf dem Root View Controller für das UIWindow führt zu nichts. Siehe meine Antwort oben: stackoverflow.com/questions/18294872/…
jaredsinclair
Wie macht man das für einen UITabBarController @Andrea? Vielen Dank.
KarenAnne
@KarenAnne Hängt davon ab, ob Sie programmgesteuert oder mit Storyboards arbeiten. Programmgesteuert müssen Sie nur die Eigenschaft edgeForExtent so einstellen, wie Sie es in dem Ansichts-Controller möchten, den Sie im UITabBarViewController anzeigen. Um das Problem der Statusleiste nicht zu haben, müssen Sie einen uinavigationcontroller in den UITabbarController laden. Überprüfe hier. developer.apple.com/library/ios/documentation/UserExperience/…
Andrea
11

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

Igor
quelle
5
Apple geht davon aus, dass jeder das automatische Layout verwendet. Das automatische Layout war in Xcode 4 schrecklich, und Xcode 5 wurde gerade erst veröffentlicht, daher ist dies eine zweifelhafte Annahme.
Glenn Maynard
1
In Zukunft ist dies jedoch eine bessere Lösung, als die Größe des Rahmens des Stammfensters oder der Statusleiste zu ändern.
Igor
Soweit ich das beurteilen kann, funktioniert die Lösung von Apple nicht, wenn Ihr rootViewController ein splitViewController ist.
Vern Jensen
8

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 sie 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 Selbstansicht mit 20 Pixeln. Das ist alles. Dann wird der Screenshot genauso angezeigt wie iOS 6. Ich hasse die iOS7 Statusleiste! ~ "~

Feuerschlag
quelle
2
wo soll ich das hinzufügen in App Delegierte mit Optionen gestartet?
Mhmdshawqi
Wenn ich das mache, wird meine Statusleiste weiß
ropo
6

Eine kleine Alternative zu Archy Holts Antwort, etwas einfacher:

ein. Setzen Sie UIViewControllerBasedStatusBarAppearanceauf NOin info.plist

b. In AppDelegate's application:didFinishLaunchingWithOptions:rufen Sie an:

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ügen Sie die Methode hinzu:

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

Sie können auch eine Unterklasse UIWindowin Betracht ziehen , um sich UIApplicationDidChangeStatusBarOrientationNotificationselbst zu behandeln .

Cœur
quelle
Haben Sie ein Problem mit presentViewController: animiert: Fertigstellung :?
Tùng Đỗ
@ TùngĐỗ wahr, also habe ich eine Alternative gemacht, die besser funktioniert: stackoverflow.com/questions/18294872/…
Cœur
5

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];
}
IgniteCoders
quelle
1
Arbeitete wie ein Zauber und war kinderleicht. In Ruby-Bewegung, vor dem Aufruf zur Super-Verwendung: self.edgesForExtendedLayout = UIRectEdgeNone, wenn antwortetToSelector ("KantenForExtendedLayout")
Professor
4

Versuchen Sie diese einfache Methode ....

Schritt 1 : In Single wechselnviewController

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

Schritt 2 : Ändern der gesamten Anwendung

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

Schritt 3 : Fügen Sie dies jeweils hinzu viewWillAppear, um die statusbarHöhe für anzupasseniOS7

    [[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];
    }
Rajesh Loganathan
quelle
3

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

Setzen Sie UIViewControllerBasedStatusBarAppearance in info.plist auf NO

Fügen Sie diesen Code in die - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsMethode ein

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 dies zu überwinden, verwenden Sie den folgenden Code in der -(void)viewDidAppear:(BOOL)animatedMethode

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 Fensterzuweisung in der didFinishLauncing-Methode wie festlegen

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"];
Wüstenrose
quelle
Ein besserer Ansatz ist es, Ihre UINavigationBar heightauf 64 anstatt auf 44 zu setzen. Dann wird Ihre Leiste wie in Apples Apps ganz nach oben verschoben .
Aaron Brager
@AaronBrager Aber meine Anforderung war es, die Statusleiste im iOS 6-Stil anzuzeigen.
Desert Rose
Können Sie bitte die Lösung für Landschaftsorientierung iOS 7 hinzufügen?. Ich mache das gleiche. In iOS 7 Landscape funktioniert es jedoch nicht.
Sathiamoorthy
@ DesertRose THX! Das funktioniert bei mir, aber es schneidet die Uitabbar unten ab. Ich habe eine auf Registerkartensteuerungen basierende App mit 3 Ansichten, von denen 2 Tabellenansichtssteuerungen sind.
Marciokoko
1
Bis ich das Gerät drehe (mein iOS 7-Gerät ist ein iPad), wird dies perfekt behoben. Aber sobald ich mich drehe, bleibt der schwarze Balken genau dort, wo er ist, und die "Ansicht" (sorry, wenn das der falsche Fachbegriff ist, ich bin ein PhoneGap- / Web-Typ) behält ihre geschrumpfte Höhe bei - außer es ist nicht mehr die Höhe, es ist die Breite. Diese Lösung unterstützt keine Rotation, ist jedoch die beste Lösung, die ich je gesehen habe. Wie kann die Überwachung auf Gerätedrehungen verbessert werden? Vielen Dank!
Tyler
2

Wenn Sie den Interface Builder verwenden, versuchen Sie Folgendes:

In Ihrer xib-Datei:

1) Wählen Sie die Hauptansicht aus und stellen Sie die Hintergrundfarbe auf Schwarz ein (oder auf die Farbe, die die Statusleiste haben soll)

2) Stellen Sie sicher, dass der Hintergrund eine in sich geschlossene Unteransicht ist, die als untergeordnetes Element der obersten Ebene der Controller-Ansicht positioniert ist.
Verschieben Sie Ihren Hintergrund, um ein direktes untergeordnetes Element der Ansicht des Controllers zu werden. Überprüfen Sie im Bereich "Autosizing", ob Sie alle Rahmenkanten gesperrt und beide Flexibilitätsachsen aktiviert haben. Wenn es sich um eine UIImageView handelt, stellen Sie den Inhaltsmodus auf "Skalieren", um ihn zu füllen. Programmatisch bedeutet dies, dass contentMode auf UIViewContentModeScaleToFill gesetzt ist und die Maske für die automatische Größenänderung auf (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight) gesetzt ist.

3) Verschieben Sie nun alles, was oben gesperrt ist, um 20 Punkte nach unten und setzen Sie ein iOS 6/7-Delta Y auf -20.
Alle untergeordneten Elemente der obersten Ebene, die im Autosizing-Bedienfeld an den oberen Frame gebunden sind, müssen um 20 Punkte nach unten verschoben und auf iOS 6/7 Delta Y auf -20 eingestellt werden. (Cmd wähle alle aus und klicke 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 mit flexibler Höhe an. Für alle Elemente, die oben und unten am Rahmen verriegelt waren und deren flexible Höhe im Autosizing-Bereich aktiviert war, 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 nicht intuitiv erscheinen, ist jedoch aufgrund der Reihenfolge, in der diese angewendet werden, erforderlich. Die Rahmenhöhe wird zuerst eingestellt (basierend auf dem Gerät), dann werden die Deltas angewendet, und schließlich werden die Masken für die automatische Größenanpassung basierend auf den Versatzpositionen aller untergeordneten Rahmen angewendet - überlegen Sie es sich ein wenig, es wird Sinn machen.

5) Schließlich benötigen Gegenstände, die am unteren Rahmen, aber nicht am oberen Rahmen befestigt waren, überhaupt keine Deltas.

Dadurch erhalten Sie die identische Statusleiste in iOS7 und iOS6.

Wenn Sie dagegen das iOS7-Design unter Beibehaltung der iOS6-Kompatibilität wünschen, setzen Sie die Delta-Y / Delta-Höhenwerte 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

thebman
quelle
Keine Deltas bei Verwendung des automatischen Layouts
Lostintranslation
2

Meine Lösung bestand darin, unter UIViewiOS 7 eine 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 Statusleiste "fest" 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 zum Ein- und Ausblenden des schwarzen Hintergrunds der Statusleiste erstellt:

- (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 anrufen, [appDelegate showSolidStatusBar:YES]wenn es nötig ist.

Alexandre OS
quelle
2

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 habe ich eine Utility-Methode in eine Utility-Klasse geschrieben und sie von allen View-Controllern aus aufgerufen 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];
        }
    }

Überschreiben Sie Ihre viewDidLayoutSubviewsMethode im View Controller, wo Sie die Statusleiste wünschen. Es wird Sie durch die Last von Autolayout bringen.

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

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

Wie installiere ich ein älteres SDK auf dem neuesten Xcode?

  1. Sie können das iOS 6.1 SDK unter http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html herunterladen oder einen älteren Xcode herunterladen und das SDK aus dessen Inhalt herunterladen

  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

Hoffe es hilft dir. Es hat bei mir funktioniert =)

marcelosalloum
quelle
arbeitete für mich. Vielen Dank an @marcelosalloum, aber ich suche immer noch nach einer Problemumgehung für meine Phonegap-App (uiwebview), um die transparente Statusleiste von iOS7 für zukünftige Updates meiner App zu unterstützen. Danke noch einmal. ;)
Hanismus
@marcellosaloum, bist du sicher, dass die App von Apple akzeptiert wird? Sie sagten, dass die mit XCode 4 kompilierten Apps nicht mehr akzeptiert würden ... das bedeutet in der Tat iOS 6 SDK.
Valerio
Meine App wurde tatsächlich akzeptiert, da Xcode5 ältere iOS-SDKs kompilieren kann. Ich bin nicht sicher, ob AppStore von Xcode4 erstellte Apps ablehnt, aber (Xcode4! = IOS 6 SDK), wie Sie sagten.
marcelosalloum
War das nach dem 1. Februar? An diesem Tag machte Apple dies obligatorisch.
Valerio
Nein, ich habe diesen Code letztes Jahr zuletzt berührt, Leute. Ich wusste nicht, dass Apple dies obligatorisch gemacht hat (nicht glücklich zu wissen). Würden Sie bitte hier den Link posten, der das sagt? Prost
marcelosalloum
1

Als mit presentViewController:animated:completion:vermasselten diewindow.rootViewController.view ich das , musste ich einen anderen Ansatz für dieses Problem finden. Ich habe es endlich geschafft, mit Modalen und Rotationen zu arbeiten, indem ich die UIView meines rootViewControllers unterklassifiziert habe.

.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 Problemumgehung für iOS7-Animationen.

Cœur
quelle
1

Ich bin 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.plistDatei und fügen Sie den Statusleistenstil hinzu-> Transparenter schwarzer Stil (Alpha von 0,5)

Jetzt geht es los: -

Fügen Sie diesen Code in Ihre 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;
   }
Vizllx
quelle
0

Meine sehr einfache Lösung (vorausgesetzt, Sie unterstützen nur die vertikale Ausrichtung) besteht darin, die Grenzen des Anwendungsfensters für iOS-Versionen unter 7 in der Methode didFinishLaunchingWithOptions des App-Delegaten 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];
}
jki
quelle
Ihr Code verschiebt nur das 'y' von 0 auf 20, passt die Höhe jedoch nicht entsprechend an, sodass Sie screenBounds.size.height - = 20 hinzufügen sollten. kurz nach screenBounds.origin.y = 20;
Amit C.
0

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 einstellen.

Christopher Rex
quelle
2
wo UIStatusbarstylenone angeben
user4951
0

Schritte zum Ausblenden der Statusleiste in iOS 7:

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

2.Und Set, View Controller-basiertes Statusleisten-Erscheinungsbild: Boolean NO

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

Chandrika
quelle
0

Um weiterhin mit setStatusBarHidden zu arbeiten: Ich benutze 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
Tomer Even
quelle
0

Dies ist möglicherweise zu spät zum Teilen, aber ich habe etwas beizutragen, das jemandem helfen könnte. Ich habe versucht, die UINavigationBar in eine Unterklasse einzuteilen, und wollte, dass sie wie ios 6 mit schwarzer Statusleiste und Statusleisten-Text in Weiß 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()

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

iOS 9.3, XCode 7.3.1

channi
quelle