iOS 7状态栏半透明,具有向后兼容性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 7状态栏半透明,具有向后兼容性相关的知识,希望对你有一定的参考价值。

我构建了我的应用程序,在ios 6中有一个半透明的导航栏。我想利用iOS 7中的半透明状态栏并保持iOS 6中的应用程序,但我的内容总是在iOS 7的状态栏下面,底部缺少20px。我认为我可以进行非常繁琐的代码更改,检查设备是否具有iOS 7,然后相应地调整我的内容,但我担心这将是很多工作。

理想情况下,我想在每个视图控制器的视图顶部添加20px的填充,以便内容向下移动,并且在iOS 6上使用不透明的导航栏仍能正常运行。

我已经阅读了主题1 2上存在的主题,但没有提供的答案解决了我的问题。

我应该注意,我没有使用Interface Builder,所有的VC都是以编程方式创建的。

答案

如果您正在使用auto layout,那么您需要做的就是将最顶层视图中的Vertical Constraint添加到Top Layout Guide,如下所示,它应该注意顶部间距。

欲了解更多信息:https://developer.apple.com/library/ios/qa/qa1797/_index.html

另一答案

您可以使用iOS6 / 7增量的新Xcode 5功能将-20设置为您的所有视图,这将为您提供类似的体验。在界面构建器中为iOS7正确设置视图,并使用增量来支持iOS6。

另一答案

这就是我用20px(状态栏的高度)来填充视图顶部所做的一切。

我在AppDelegate的应用程序中使用了这段代码:didFinishLaunchingWithOptions:method

...
// container holds my root view controller
UINavigationController *container = [UINavigationController alloc] init...];
...

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { // iOS 7
    // Create parent controller that will contain your existing root view controller's view shifted 20 px down to account for the status bar.
    UIViewController *newRootController = [[UIViewController alloc] init];

    // Add my old root view controller as a child
    [newRootController addChildViewController:container];

    // Add its view as a subview
    [newRootController.view addSubview:container.view];

    // Call this method because it does some configuration?
    [container didMoveToParentViewController:newRootController];

    // Now just position the view starting at point (0, 20)
    UIView *aView = container.view;

    NSDictionary *viewDictionary = NSDictionaryOfVariableBindings(aView);
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[aView]|" options:0 metrics:nil views:viewDictionary];

    [newRootController.view addConstraints:constraints];
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[aView]|" options:0 metrics:nil views:viewDictionary];

    [newRootController.view addConstraints:constraints];

    self.window.rootViewController = newRootController;
} else { // pre iOS 7
    self.window.rootViewController = container;
}

现在,无论何时你在iOS 7中,一切都将存在于根视图控制器的视图中,该视图向下移动了20个像素。您只需在AppDelegate中执行此操作一次。

另一答案

设置UIViewControllerBasedStatusBarAppearance' to NO in info.plist (To opt out of having view controllers adjust the status bar style so that we can set the status bar style by using theUIApplicationstatusBarStyle`方法。)

在AppDelegate的应用程序中:didFinishLaunchingWithOptions,调用

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

    //Added on 19th Sep 2013
    self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
}
return YES;
另一答案

您可以通过设置以下内容禁用ios 7顶部栏下的视图:

if([controller canPerformAction:@selector(setEdgesForExtendedLayout:) withSender:self]) {
        [controller setEdgesForExtendedLayout:UIRectEdgeBottom | UIRectEdgeLeft | UIRectEdgeRight];
}

以上是关于iOS 7状态栏半透明,具有向后兼容性的主要内容,如果未能解决你的问题,请参考以下文章

ios导航栏半透明设置为NO改变底部UICollectionView的高度

Apple iOS 是不是支持向后兼容?

如何使 iOS 7 应用向后兼容?

Xcode 5 Asset Catalog 是不是向后兼容 pre-iOS 7?

在 UITableViews 中设置导航栏半透明以启动动画

Xcode 7 Stack Views 如何向后兼容 iOS 8 和 iOS 7?