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

时间:2013-09-20 04:55:31

标签: xcode ios6 uiview ios7 statusbar

我最近发布了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)];
}

enter image description here

2 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分: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!");
                             }];
        }
    }
}