1

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

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

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

4

2 回答 2

2

我讨厌这样的解决方案。但我的解决方法仅适用于 iOS7,在 viewDidAppear 中将视图的 frame.origin.y 与导航栏的 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!");
                             }];
        }
    }
}
于 2013-10-15T17:51:14.723 回答
1

如果您还没有使用自动布局。尝试为此设置增量。

于 2013-10-15T10:56:52.920 回答