iOS 7 状态栏和 self.view.frame 和 self.view.bounds

Posted

技术标签:

【中文标题】iOS 7 状态栏和 self.view.frame 和 self.view.bounds【英文标题】:iOS 7 status bar and self.view.frame and self.view.bounds 【发布时间】:2013-09-25 09:16:23 【问题描述】:

我最近发布了一个 ios6 应用程序,我需要为 iOS 7 更新它。新的状态栏有点问题。 self.view 的框架/边界似乎发生了变化(+20 分),我使用 self.view.bounds 来确定某些元素的位置。我一直在寻找一些解决方案。基本上我需要更新应用程序,同时仍然支持 iOS 6 状态栏。对此有最佳做法吗?

下面的代码似乎可以检测 iOS 7 设备并将内容移动到适当位置,但也会导致其他问题。无论如何,我不相信这是最好的方法。

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 setFrame:CGRectMake(0, heightPadding, self.view.frame.size.width, self.view.frame.size.height - heightPadding)];

【问题讨论】:

Status bar and navigation bar appear over my view's bounds in iOS 7 的可能重复项 【参考方案1】:

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

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

您需要在您的 -(void)viewDidLoad 方法中添加上述代码。

【讨论】:

谢谢!但无论我是否使用此代码,self.view 边界和框架高度都是 568。我假设这些数字应该是 548,帧原点应该是 0、20? 这段代码会将帧高从568变为548。以上代码只会在iOS7中执行。 @Nandha 是的,它对我来说工作正常。但我的应用程序有 Tabbacontroller alos。视图控制器的其余部分工作正常。 Tabbar 视图控制器中的问题。假设我有 5 个标签。 1. 当我单击选项卡(打开列表屏幕)时,当我单击列表详细信息打开正常时,它工作正常。直到它工作正常 2. 当我点击选项卡 2(另一个列表)时打开。那个时候,当我点击 tab1 时,比细节屏幕主视图框架减少到 64px。我试图强行增加但没有工作..在这种情况下我该怎么办?? 我有两个代码非常相似的应用程序,这适用于一个但不适用于另一个,我无法弄清楚原因。一方面,self.view.bounds.size.height 是 548,另一方面是 568。 如果您在顶部有导航或工具栏,此解决方案将有效。如果您有没有任何视图的普通视图,它将无法正常工作。为此,如果您需要参考我的旧问题,您需要不同的解决方案。【参考方案2】:

我使用此解决方案在模态对话框中调整我的视图:

- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];

    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) 
        CGRect sbFrame = [[UIApplication sharedApplication] statusBarFrame];
        __block CGRect vFrame = self.view.frame;
        __block CGFloat diff = sbFrame.size.height + sbFrame.origin.y - vFrame.origin.y;
        if (diff > 0.0)
        
            [UIView animateWithDuration:UINavigationControllerHideShowBarDuration
                                  delay:0.0
                                options: UIViewAnimationOptionCurveEaseOut
                             animations:^
                                 vFrame.origin.y += diff;
                                 vFrame.size.height -= diff;
                                 self.view.frame = vFrame;
                             
                             completion:^(BOOL finished)
                                 NSLog(@"Done!");
                             ];
        
    

【讨论】:

以上是关于iOS 7 状态栏和 self.view.frame 和 self.view.bounds的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 中 UIActivityViewControllers 的模态状态栏和导航栏文本颜色

iOS 7,状态栏和导航栏:像 Reeder 一样使用侧面板隐藏或滑动

在 iOS 7 中,状态栏和导航栏出现在我的视图边界上

iOS 7 状态栏和 self.view.frame 和 self.view.bounds

iOS 获取状态栏、导航栏、tabBar高度

iOS 状态栏和 UIView