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

Xcode iOS 7状态栏、self.view.frame和self.view.bounds,xcode,ios6,uiview,ios7,statusbar,Xcode,Ios6,Uiview,Ios7,Statusbar,我最近发布了一个iOS6应用程序,我需要为iOS7更新它。新的状态栏有点问题。self.view的框架/边界似乎已更改(+20个点),我使用self.view.bounds来确定某些元素的位置。我一直在寻找一些解决办法。基本上,我需要更新应用程序,同时仍然支持iOS 6状态栏。这方面有最佳实践吗 下面的代码似乎可以检测iOS 7设备并将内容移动到位,但也会导致其他问题。无论如何,我不相信这是最好的方法 if([[[[UIDevice currentDevice] systemVersion] c

我最近发布了一个iOS6应用程序,我需要为iOS7更新它。新的状态栏有点问题。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)];
}

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

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

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

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

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

可能重复的谢谢!但self.view边界和帧高度是568,无论我是否使用此代码。我假设这些数字应该是548,帧原点应该是0,20?此代码将使帧高度从568变为548。上面的代码只会在iOS7中执行。@Nandha是的,对我来说工作正常。但我的应用程序有Tabbacontroller alos。viewcontroller的其余部分工作正常。选项卡栏视图控制器中的问题。假设我有5张账单。1.当我单击选项卡(列表屏幕打开)时,当我单击列表详细信息打开精细时,它工作正常。到目前为止,它还可以工作。当我点击标签2(另一个列表)打开。当我点击tab1时,细节屏幕主视图框会减少到64px。我曾试图强行增加工资,但没有奏效。。在这种情况下,我能做什么?我有两个代码非常相似的应用程序,一个可以工作,另一个不行,我还不知道为什么。一方面,self.view.bounds.size.height是548,另一方面是568。如果在顶部有导航或工具栏,这个解决方案将有效。如果你有一个没有任何视图的普通视图,它将不起作用。对于这一点,你需要不同的解决方案,如果你需要参考我的老问题,它有解决方案。