ios历史 - 维基百科ios




状态栏和导航栏显示在iOS 7中的视图边界上 (13)

我最近下载了Xcode 5 DP来在iOS 7中测试我的应用程序。我注意到并确认的第一件事是我的视图边界并不总是调整到状态栏和导航栏的大小。

viewDidLayoutSubviews ,我打印视图的边界:

{{0,0},{320,568}}

这会导致我的内容出现在导航栏和状态栏下方。

我知道我可以通过获得主屏幕的高度来减去状态栏的高度和导航栏的高度来解释高度,但这似乎是不必要的额外工作。

我该如何解决这个问题?

更新:

我找到了解决这个问题的解决方案。 将导航栏的半透明属性设置为NO:

self.navigationController.navigationBar.translucent = NO;

这将修复导航栏和状态栏下面的视图。

但是,当您希望导航栏变为半透明时,我还没有找到解决方案。 例如,全屏查看照片,我希望导航栏半透明,并将视图框在其下面。 这有效,但当我切换显示/隐藏导航栏时,我遇到了更奇怪的结果。 第一个子视图(UIScrollView)每次都会更改其原点的边界。


Swift 3 / Swift 4解决方案也适用于iOS 10+中的NIBs / XIB文件:

override func viewDidLoad() {
    super.viewDidLoad()

    edgesForExtendedLayout = []
}

Swift解决方案:

override func viewWillAppear(animated: Bool) {
    self.edgesForExtendedLayout = UIRectEdge.None
}

斯威夫特3

override func viewWillAppear(_ animated: Bool) {
    self.edgesForExtendedLayout = []
}

像这样对Top Layout进行限制


在下拉列表中添加关键字“View Controller-based status bar appearance”作为info.plist的一行。 像这样的东西:


在您的应用程序plist文件中添加一行,将其称为“查看基于控制器的状态栏外观”并将其设置为NO


如果你想让视图具有半透明的导航栏(这是很好的),你必须设置一个contentInset或类似的。

以下是我如何做到的:

// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
      CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
      float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;

      myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}

对我而言,最简单的解决方案是在plist中添加两个键


您可以通过在iOS7 SDK中实现一个名为edgesForExtendedLayout的新属性来实现此目的。 请添加以下代码来实现此目的,

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

您需要在-(void)viewDidLoad方法中添加上述内容。

iOS 7对您如何布局和自定义UI外观进行了一些更改。 视图控制器布局,色调和字体的变化会影响应用中的所有UIKit对象。 另外,手势识别器API的增强功能可以更好地控制手势交互。

使用视图控制器

在iOS 7中,视图控制器使用全屏布局。 同时,iOS 7可以让您更细致地控制视图控制器布置其视图的方式。 特别是,全屏布局的概念已经完善,可以让视图控制器指定其视图每个边缘的布局。

在iOS 7中不推荐使用wantsFullScreenLayout视图控制器属性。如果当前指定wantsFullScreenLayout = NO ,则视图控制器在iOS 7中运行时可能会在意外的屏幕位置显示其内容。

要调整视图控制器布局视图的方式, UIViewController提供了以下属性:

  • edgesForExtendedLayout

edgesForExtendedLayout属性使用UIRectEdge类型,除了指定none和all以外,还指定矩形的四个边中的每一个。 使用edgesForExtendedLayout来指定视图的哪些边应该被扩展,而不管酒吧的半透明度如何。 默认情况下,此属性的值为UIRectEdgeAll

  • extendedLayoutIncludesOpaqueBars

如果您的设计使用不透明条纹, edgesForExtendedLayout还可以通过将extendedLayoutIncludesOpaqueBars属性设置为NO来优化edgesForExtendedLayout 。 ( extendedLayoutIncludesOpaqueBars的默认值为NO 。)

  • automaticallyAdjustsScrollViewInsets

如果您不想自动调整滚动视图的内容插页,请将automaticallyAdjustsScrollViewInsets调整滚动视图插入设置为NO 。 ( automaticallyAdjustsScrollViewInsets的默认值为YES 。)

  • topLayoutGuide,bottomLayoutGuide

topLayoutGuidebottomLayoutGuide属性指示视图控制器视图中顶部或底部条边的位置。 如果条应与视图的顶部或底部重叠,则可以使用Interface Builder通过在topLayoutGuide的底部或topLayoutGuide的顶部创建约束来定位视图相对于条的位置。 (如果没有条应与视图重叠,则topLayoutGuide的底部与视图的顶部相同,而topLayoutGuide的顶部与视图的底部相同。)这两个属性都是在请求时延迟创建的。

请参阅苹果文档


我以编程方式创建了我的视图,并最终为我工作:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Source (位于第39页底部的topLayoutGuide部分)。


我想扩展Stunner的答案,并添加if语句来检查它是否是iOS-7,因为当我在iOS 6上测试它时,我的应用程序会崩溃。

补充将增加:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

所以我建议将这种方法添加到MyViewControler.m文件中:

- (void) viewDidLayoutSubviews {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
    }
}

我有一个场景,我使用Apple编写的BannerViewController来显示我的广告以及BannerViewController中嵌入的ScrollViewController。

为了防止导航栏隐藏我的内容,我必须做出两处更改。

1)修改BannerViewController.m

- (void)viewDidLoad
{
   [super viewDidLoad];
   float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
   if (systemVersion >= 7.0) {
      self.edgesForExtendedLayout = UIRectEdgeNone;
   }
}

2)修改我的ScrollViewContoller

- (void)viewDidLoad
{
    [super viewDidLoad];
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0) {
        self.edgesForExtendedLayout = UIRectEdgeBottom;
    }
}

现在广告正确显示在视图的底部,而不是被导航栏覆盖,而顶部的内容未被截断。


步骤隐藏iOS 7中的状态栏:

1.转到您的应用程序info.plist文件。

2.And Set,基于视图控制器的状态栏外观:Boolean NO

希望我解决了状态栏问题.....





ios7