wake-up-neo.com

iOS 7 - Die Statusleiste überlappt die Ansicht

Ich habe ein ViewController, das sich in einem UINavigationcontroller befindet, aber die Navigationsleiste ist ausgeblendet. Wenn ich die App unter iOS 7 starte, wird die Statusleiste über meiner Ansicht angezeigt. Gibt es eine Möglichkeit, dies zu vermeiden?

Ich möchte keinen betriebssystemspezifischen Code schreiben.

Enter image description here

Ich habe versucht, View controller-based status bar appearance bis NO, das Problem wurde jedoch nicht behoben.

109
aryaxt

Xcode 5 hat iOS 6/7 Deltas, Das speziell entwickelt wurde, um dieses Problem zu beheben. Im Storyboard habe ich meine Ansichten um 20 Pixel nach unten verschoben, um auf iOS 7 richtig auszusehen, und um iOS 6 kompatibel zu machen, habe ich Delta y Auf -20 geändert.

enter image description here

Da mein Storyboard kein automatisches Layout verwendet, musste ich sowohl Delta height Als auch Delta Y Einstellen, um die Höhe der Ansichten unter iOS 6 korrekt zu ändern.

95
aryaxt

Wenn Sie einfach KEINE Statusleiste möchten, müssen Sie Ihre Liste mit diesen Daten aktualisieren: Fügen Sie dazu in der Liste die beiden folgenden 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. Sehen Sie sich zum Beispiel die neue iOS 7-Wetter-App an.

69
Nathan H

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

Wenn Sie ein UIViewController innerhalb eines UINavigationController haben und die Navigationsleiste sichtbar ist, können Sie den folgenden Code in Ihrem viewDidLoad haben oder ein Hintergrundbild für die Navigationsleiste den Trick machen lassen.

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

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

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

1 Unterklasse von UIViewController

2 Subklassifizieren Sie Ihren window.rootViewController von 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];
}
15
comonitos
-(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);
    }
  }
}

Add Key in plist --- Anzeige der Controller-basierten Statusleiste: NO

13
Darshit Shah

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

In Xcode gehe in den Ordner "Resources" und öffne "(app name)-Info.plist file ".

  • prüfen Auf "View controller based status bar appearance "key und setze den Wert" NO "
  • prüfen Auf "Status bar is initially hidden "key und setze den Wert" YES "

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

4
Mandeep Pasbola

Wenn Sie xibs verwenden, ist es eine sehr einfache Implementierung, alle Unteransichten in einer Containeransicht mit Größenänderungsflags zu kapseln die Sie bereits für die 3.5- und 4-Zoll-Kompatibilität verwenden Die Ansichtshierarchie sieht ungefähr so ​​aus

xib heirarchy

und dann in viewDidLoad ungefähr so ​​vorgehen:

- (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 geändert werden, um die Kompatibilität mit iOS 7 zu gewährleisten. Wenn Sie einen Hintergrund haben, kann dieser außerhalb von containerView aufbewahrt werden und den gesamten Bildschirm einnehmen.

3
tipycalFlow

Dies ist alles, was benötigt wird, um die Statusleiste zu entfernen. enter image description here

3
Tony

Wenn Sie es vollständig verbergen und einfach vermeiden möchten, damit umzugehen, funktioniert dies gut.

-(BOOL) prefersStatusBarHidden
{
    return YES;
}

referenz https://stackoverflow.com/a/18873777/1030449

3
Kalel Wade

Für die Navigationsleiste:

Schreiben Sie diesen Code:

self.navigationController.navigationBar.translucent = NO;

habe gerade den Trick für mich getan.

2
CoderSaru

Vincents Antwort edgeForExtendedLayout hat bei mir funktioniert.

Diese Makros helfen bei der Bestimmung der OS-Version und erleichtern diese

// 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 der Datei prefix.pch Ihres Projekts hinzu und Sie können von ü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
}

Ich habe meine Antwort auf einen anderen Beitrag mit derselben Frage zu diesem Beitrag gepostet.

Aus dem Apple iOS7 Transition Guide, https://developer.Apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//Apple_ref/doc/uid/TP40013174-CH15-SW1

Speziell automaticallyAdjustsScrollViewInsets=YES und set self.edgesForExtendedLayout = UIRectEdgeNone funktioniert bei mir, wenn ich nicht überlappen möchte und ein tableviewcontroller habe.

1
Liangjun

Wenn Sie möchten, dass "Use Autolayout" um jeden Preis aktiviert wird, fügen Sie den folgenden Code in viewdidload ein.

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

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 einfach diese Funktion auf, wenn Sie die Position der Navigationsleiste festlegen möchten. Ich habe YTPlayerViewDelegate's playerView:didChangeToState: Aufgerufen

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