iOS 7 - Die Statusleiste überlappt die Ansicht

109

Ich habe eine, ViewControllerdie sich in einer befindet UINavigationcontroller, aber die Navigationsleiste ist versteckt. Wenn ich die App unter iOS 7 ausführe, wird die Statusleiste oben in meiner Ansicht angezeigt. Gibt es eine Möglichkeit, dies zu vermeiden?

Ich möchte keinen betriebssystemspezifischen Code schreiben.

Geben Sie hier die Bildbeschreibung ein

Ich habe versucht, Einstellungen View controller-based status bar appearancevorzunehmen NO, aber das Problem wurde dadurch nicht behoben.

aryaxt
quelle
Ich habe meine Antwort gepostet, um Statusleiste wie iOS 6 in iOS 7 zu zeigen. Stackoverflow.com/questions/18294872/…
Desert Rose
2
Sie müssen auch den y-Ursprung und den Delta-Wert anpassen, um das Problem mit der Statusleiste zu lösen.
Ganapathy

Antworten:

95

Xcode 5 wurde iOS 6/7 Deltasspeziell entwickelt, um dieses Problem zu beheben. Im Storyboard habe ich meine Ansichten um 20 Pixel nach unten verschoben, um unter iOS 7 richtig auszusehen. Um iOS 6-kompatibel zu machen, habe ich Delta yauf -20 geändert .

Geben Sie hier die Bildbeschreibung ein

Da mein Drehbuch nicht auto-Layout verwenden, hatte um die Höhe der Ansichten richtig auf iOS 6 ich , um die Größe zu setzen , Delta heightwie auch Delta Y.

aryaxt
quelle
8
Ihre Antwort ist richtig, funktioniert aber nicht mit 4-Zoll-Anzeige. Bitte aktualisieren Sie Ihre Antwort, wenn Sie sie auch für 4-Zoll-Anzeige verwenden können. Danke im Voraus.
2
@ AnkitMehta Ich musste nichts spezielles für 4 "iphones tun
aryaxt
5
arbeitete für mich. Beachten Sie, dass Sie zum Anzeigen dieses Deltas die Option "Autolayout verwenden" unter "Identität und Typ" für das Storyboard deaktivieren müssen.
Marsant
2
Ich fand heraus, dass ich nicht nur eine -20 für ∆Y setzen musste, sondern auch eine +20 auf ∆Height
Toland Hon
3
Was passiert, wenn sich die Höhe der Statusleiste ändert? Beispiel: Wenn der Benutzer den Hotspot usw. aktiviert, beträgt die Höhe 40 Pixel ...
Lukasz
69

Wenn Sie einfach KEINE Statusleiste möchten, müssen Sie Ihre Liste mit diesen Daten aktualisieren: Fügen Sie dazu in der Liste die folgenden 2 Einstellungen hinzu:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

In iOS 7 wird von Ihnen erwartet, dass Sie Ihre App mit einer überlagerten transparenten Statusleiste gestalten. Siehe zum Beispiel die neue iOS 7 Wetter-App.

Nathan H.
quelle
3
Dies ist eigentlich die einzig gute Antwort, da das Problem im Kern so behoben wird, wie es beabsichtigt war. Also: Upvotes nötig!
elf59
5
Es mag für einige Situationen angemessen sein, aber Sie möchten die Statusleiste sehr vorsichtig ausblenden. Nur für Ansichten, die zu Recht im Vollbildmodus angezeigt werden, z. B. Media Player oder Bildbetrachter.
smileBot
1
@ eleven59, du meinst die Art und Weise, wie die Autokraten bei Apple beabsichtigen.
JohnK
1
Auf jeden Fall besser als das Ändern des Versatzes eines View Controllers (der sich wirklich schmutzig anfühlt).
Benjamin Oman
Das Ausblenden der Statusleiste ist keine gute Idee ... Ich weiß, dass dies der einfachste Weg ist, mit iOS 7
umzugehen
43

Dies ist das Standardverhalten für UIViewControlleriOS 7. Die Ansicht wird im Vollbildmodus angezeigt. Dies bedeutet, dass die Statusleiste den oberen Bereich Ihrer Ansicht abdeckt.

Wenn Sie eine UIViewControllerinnerhalb von a haben UINavigationControllerund die Navigationsleiste sichtbar ist, können Sie den folgenden Code in Ihrer viewDidLoadoder ein Hintergrundbild für die Navigationsleiste ausführen .

self.edgesForExtendedLayout = UIRectEdgeNone;

Wenn Sie die Navigationsleiste ausgeblendet haben, müssen Sie alle UIView-Elemente anpassen, indem Sie 20 Punkte verschieben. Ich sehe keine andere Lösung. Die Verwendung des automatischen Layouts hilft ein wenig.

Hier ist der Beispielcode zum Erkennen der iOS-Version, wenn Sie Abwärtskompatibilität wünschen.

NSUInteger DeviceSystemMajorVersion() {
    static NSUInteger _deviceSystemMajorVersion = -1;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        NSString *systemVersion = [UIDevice currentDevice].systemVersion;
        _deviceSystemMajorVersion = [[systemVersion componentsSeparatedByString:@"."][0] intValue];
    });

   return _deviceSystemMajorVersion;
}
Vincent
quelle
18
Statt zu holen, Parsing und die Systemversion zu vergleichen, wird es empfohlenif ([self respondsToSelector:@selector(edgesForExtendedLayout)])
Sebastian Hojas
15

Einzige funktionierende Lösung, die ich selbst gemacht habe.

Hier ist meine UIViewController-Unterklasse https://github.com/comonitos/ios7_overlaping

1 Unterklasse von UIViewController

2 Unterklassifizieren Sie Ihren window.rootViewController aus dieser Klasse.

3 Voila!

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect screen = [[UIScreen mainScreen] bounds];
        if (self.navigationController) {
            CGRect frame = self.navigationController.view.frame;
            frame.origin.y = 20;
            frame.size.height = screen.size.height - 20;
            self.navigationController.view.frame = frame;
        } else {
            if ([self respondsToSelector: @selector(containerView)]) {
                UIView *containerView = (UIView *)[self performSelector: @selector(containerView)];

                CGRect frame = containerView.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                containerView.frame = frame;
            } else {
                CGRect frame = self.view.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                self.view.frame = frame;
            }
        }
    }
}

4 Fügen Sie dies hinzu, um Ihre Statusleiste weiß zu machen. Direkt nach dem [self.window makeKeyAndVisible]; !!!

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
comonitos
quelle
aber dies zeigt nicht die Zeit an der Spitze ... Größter Nachteil ... :(
Fahim Parkar
Funktioniert hervorragend, aber für Schritt 4 sollten Sie bevorzugtStatusBarStyle in Ihrem Ansichts-Controller verwenden, da setStatusBarStyle veraltet ist und die Standardaktion darin besteht, nichts zu tun. stackoverflow.com/a/19014724/1192732
CpnCrunch
13
-(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

-(void)viewWillLayoutSubviews{

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
  {
    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    if(UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
        screenHeight = screenRect.size.height;
    else
        screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, 20, self.view.frame.size.width,screenHeight-20);
    CGRect viewFrame1 = [self.view convertRect:self.view.frame toView:nil];
    if (!CGRectEqualToRect(screenFrame, viewFrame1))
    {
        self.view.frame = screenFrame;
        self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    }
  }
}

Schlüssel in Liste hinzufügen --- Aussehen der Controller-basierten Statusleiste anzeigen: NEIN

Darshit Shah
quelle
Ändern Sie die Fensterfarbe, falls erforderlich
Darshit Shah
Danke, es hat mein überlappendes Problem gelöst. Aber ein Problem ist immer noch vorhanden - Anzeigen des Status der Controller-basierten Statusleiste: NEIN, denke ich, ist das Ausblenden der Statusleiste. Aber wenn ich es auf JA setze, wird die Statusleiste nicht angezeigt, und wenn ich es auf NEIN setze, wird die Statusleiste angezeigt. Also bitte sag mir, ob ich mit dem Konzept falsch liege oder was?
Nayan
1
Ich denke, weil in didFinishLaunchingWithOptions 'self.window.backgroundColor = [UIColor blueColor];' und in plist eingestellt Controller-basiertes Statusleisten-Erscheinungsbild
anzeigen
Nett, danke! Nur um darauf hinzuweisen, dass Apple-Dokumente empfehlen, wenn Sie mit if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1) {} else {} prüfen. Prost!
Joel Balmer
Vielen Dank. Ihr Code ist für uns sehr hilfreich. Bitte erläutern Sie die Funktion viewWillLayoutSubviews.
user3182143
4

Gehen Sie folgendermaßen vor, um die Statusleiste in ios7 auszublenden:

In Xcode gehe zum ResourcesOrdner " " und öffne " (app name)-Info.plist file".

  • Suchen Sie nach dem View controller based status bar appearanceSchlüssel " " und stellen Sie den Wert " NO" ein.
  • Suchen Sie nach dem Status bar is initially hiddenSchlüssel " " und stellen Sie den Wert " YES" ein.

Wenn die Tasten nicht vorhanden sind, können Sie sie hinzufügen, indem Sie oben " information property list" auswählen und auf das Symbol + klicken

Mandeep Pasbola
quelle
Lesen Sie die Frage klar durch. Er hat nicht darum gebeten, die Statusleiste vollständig zu verbergen.
ShayanK
1
@AspersionCast: Er fragte: "Gibt es eine Möglichkeit, dies zu vermeiden?" und dies ist einer der Wege, dies zu vermeiden.
Mandeep Pasbola
3

Wenn Sie xibs verwenden, besteht eine sehr einfache Implementierung darin, alle Unteransichten in einer Containeransicht mit Größenänderungsflags zu kapseln (die Sie bereits für die Kompatibilität mit 3,5 "und 4" verwenden), sodass die Ansichtshierarchie ungefähr so ​​aussieht

xib Erbe

und dann in viewDidLoad, mach so etwas:

- (void)viewDidLoad
{
  [super viewDidLoad];
  // initializations
  if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) // only for iOS 7 and above
  {
    CGRect frame = containerView.frame;
    frame.origin.y += 20;
    frame.size.height -= 20;
    containerView.frame = frame;
  }
}

Auf diese Weise müssen die Schreibfedern nicht für die iOS 7-Kompatibilität geändert werden. Wenn Sie einen Hintergrund haben, kann dieser draußen aufbewahrt werden containerViewund den gesamten Bildschirm abdecken.

tipycalFlow
quelle
3

Dies ist alles, was zum Entfernen der Statusleiste erforderlich ist. Geben Sie hier die Bildbeschreibung ein

Tony
quelle
2

Für die Navigationsleiste:

Diesen Code schreiben:

self.navigationController.navigationBar.translucent = NO;

habe gerade den Trick für mich getan.

Saru
quelle
1

Vincents Antwort KantenForExtendedLayout hat bei mir funktioniert.

Diese Makros helfen bei der Bestimmung der Betriebssystemversion und erleichtern dies

// 7.0 and above 
#define IS_DEVICE_RUNNING_IOS_7_AND_ABOVE() ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) 

// 6.0, 6.0.x, 6.1, 6.1.x
#define IS_DEVICE_RUNNING_IOS_6_OR_BELOW() ([[[UIDevice currentDevice] systemVersion] compare:@"6.2" options:NSNumericSearch] != NSOrderedDescending) 

Fügen Sie diese Makros zur Datei prefix.pch Ihres Projekts hinzu und können Sie überall darauf zugreifen

if(IS_DEVICE_RUNNING_IOS_7_AND_ABOVE())
{
 //some iOS 7 stuff
 self.edgesForExtendedLayout = UIRectEdgeNone;
}

if(IS_DEVICE_RUNNING_IOS_6_OR_BELOW())
{
 // some old iOS stuff
}
RamaKrishna Chunduri
quelle
1
für mich self.edgesForExtendedLayout = UIRectEdgeNone; funktioniert nicht ... irgendein Grund warum?
Fahim Parkar
1

Ich habe meine Antwort auf einen anderen Beitrag mit der gleichen Frage wie dieser gepostet.

Im Apple iOS7-Übergangshandbuch finden Sie https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1

Speziell automaticallyAdjustsScrollViewInsets=YESund set self.edgesForExtendedLayout = UIRectEdgeNonefunktioniert für mich, wenn ich die Überlappung nicht will und ich eine habe tableviewcontroller.

Liangjun
quelle
0

Wenn Sie möchten, dass "Autolayout verwenden" um jeden Preis aktiviert wird, geben Sie den folgenden Code in viewdidload ein.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
{
        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.extendedLayoutIncludesOpaqueBars = NO;
        self.automaticallyAdjustsScrollViewInsets = NO;
}
Ali Shahid
quelle
0

Meine Statusleiste und Navigationsleiste überlappen sich nach der Rückkehr aus der Querformatansicht von YTPlayer. Hier ist meine Lösung, nachdem ich die Version von @comonitos ausprobiert habe, aber auf meinem iOS 8 nicht funktioniert habe

- (void)fixNavigationBarPosition {
    if (self.navigationController) {
        CGRect frame = self.navigationController.navigationBar.frame;
        if (frame.origin.y != 20.f) {
            frame.origin.y = 20.f;
            self.navigationController.navigationBar.frame = frame;
        }
    }
}

Rufen Sie diese Funktion einfach auf, wenn Sie die Position der Navigationsleiste festlegen möchten. Ich habe YTPlayerViewDelegate's aufgerufenplayerView:didChangeToState:

- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state {
    switch (state) {
        case kYTPlayerStatePaused:
        case kYTPlayerStateEnded:
            [self fixNavigationBarPosition];
            break;
        default:
    }
}
John Pang
quelle