使用新iOS7 SDK在视图上方显示带有提示的导航栏

时间:2013-10-15 01:43:18

标签: iphone ios objective-c ipad ios7

我确定我的导航栏不是半透明的,我已将其添加到我的viewDidLoad中,因此带有提示的导航栏在首次显示时不会与我的视图重叠:

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

这很有效,直到我导航到一个没有提示的导航栏的视图控制器,然后弹回。当带有提示的导航栏重新显示时,导航栏使用一些内部动画向下延伸到其完整大小(在调用viewDidAppear之后!),并且我的视图与30像素差异部分重叠。关于我能做些什么的任何想法?

2 个答案:

答案 0 :(得分:2)

我讨厌这样的解决方案。但我的解决方法仅适用于iOS7,将视图的frame.origin.y与viewDidAppear中导航栏的frame.origin.y + frame.size.height进行比较。如果它们不同,我会调整视图大小并重新定位视图,使动画看起来不那么愚蠢。该视图还有一个滚动视图作为子视图,所以我必须稍微调整一下:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        CGRect nbFrame = self.navigationController.navigationBar.frame;
        __block CGRect vFrame = self.view.frame;
        __block CGFloat diff = nbFrame.size.height + nbFrame.origin.y - vFrame.origin.y;
        if (diff > 0.0) {
            __block CGSize size = scrollView.contentSize;
            [UIView animateWithDuration:UINavigationControllerHideShowBarDuration
                                  delay:0.0
                                options: UIViewAnimationOptionCurveEaseOut
                             animations:^{
                                 vFrame.origin.y += diff;
                                 vFrame.size.height -= diff;
                                 self.view.frame = vFrame;

                                 size.height -= diff;
                                 scrollView.contentSize = size;
                             }
                             completion:^(BOOL finished){
                                 NSLog(@"Done!");
                             }];
        }
    }
}

答案 1 :(得分:1)

如果您还没有使用autolayout。请尝试为此设置delta。