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

5
我最近发布了一个iOS6应用程序,现在需要将其更新为iOS 7。新的状态栏有一些问题。self.view的frame/bounds似乎已经改变了(+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)];
}

enter image description here


2个回答

11

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

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

你需要将上述代码添加到你的-(void)viewDidLoad方法中。


谢谢!但是无论我是否使用这段代码,self.view的bounds和frame高度都是568。我认为这些数字应该是548,而且frame的原点应该是0,20? - OWolf
这段代码将把框架高度从568改为548。以上代码仅在iOS7中执行。 - Nandha
@Nandha 是的,对我来说它运行良好。但是我的应用程序也有Tabbacontroller。其余的viewcontroller都正常工作。问题出在Tabbar视图控制器上。假设我有5个选项卡。1.当我点击选项卡(列表屏幕打开)时,它正常工作,当我点击列表详细信息时也可以正常打开。到目前为止一切正常2.当我点击选项卡2(另一个列表)时打开。那时,当我点击选项卡1时,详细屏幕的主视图框架会减少到64px。我试图强制增加但不起作用..在这种情况下我该怎么办? - Hitarth
我有两个非常相似的代码应用程序,其中一个可以正常工作,但另一个却不能,并且我一直无法找出原因。在其中一个应用程序中,self.view.bounds.size.height为548,在另一个应用程序中为568。 - primehalo
如果您的应用程序顶部有导航栏或工具栏,则此解决方案将起作用。如果您没有任何视图的纯视图,则它将无法工作。如果需要,请参考我的旧问题,其中有解决方案。 - Nandha

0

我使用了这个解决方案来调整我的模态对话框中的视图:

- (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!");
                             }];
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接