隐藏导航栏将视图“向上”移动

Posted

技术标签:

【中文标题】隐藏导航栏将视图“向上”移动【英文标题】:Hiding Nav Bar moves view "up" 【发布时间】:2013-10-23 15:04:00 【问题描述】:

通常的故事——我正在制作一个在 ios 7 下运行的 iOS 5/6 应用程序,并且导航栏行为的改变导致了一个问题。

该应用已经像 iOS 7 默认一样工作,具有全屏视图和视图“上方”的半透明导航栏。问题是在 iOS 7 中隐藏/取消隐藏导航栏会导致不同的行为。在 iOS 5/6 上,隐藏/取消隐藏导航栏不会改变视图。在 iOS 7 上,隐藏栏在视觉上会向上移动视图,在屏幕底部留下一个空白栏,取消隐藏栏会向下移动视图以占据全屏(当然,导航栏在顶部)。

我需要继续支持 iOS 5,所以我不使用自动布局,但我使用全屏。 我有一个正在查看可缩放图像的视图——因此视图控制器有一个全屏视图,其中包含一个包含 imageView 的 scrollView。

状态栏总是隐藏的。

我通过导航控制器进入视图控制器,因此在全屏视图/scrollView/imageView 的顶部有一个(黑色,半透明)导航栏。

在短暂的延迟之后,一些重叠的标签会消失并且导航栏被隐藏 单击即可恢复覆盖标签并取消隐藏导航栏。 这适用于 iOS 5/6 - 导航栏从屏幕顶部滑出,露出视图/图像的顶部。

在 iOS 7 上,当导航栏从屏幕顶部滑出时,整个视图在视觉上会向上移动相应的量(即 44 点),在屏幕底部留下一个黑条。我可以通过在***视图上设置背景颜色并调整滚动视图的大小以看到背景来看到这一点;视图的顶部确实移出了屏幕,并且背景颜色没有绘制在屏幕的底部(44 点)上。

但是,self.view.frame 没有改变,并且保持在 0, 0 320 x 高度。

当我单击以恢复覆盖信息和导航栏时,视图会向下移动以占据全屏,并且半透明导航栏位于视图/图像的顶部。

我没有尝试过改变行为: 更改 IB 视图控制器布局控件(在顶栏下、在底栏下、调整滚动视图插图)。在 7.0 下运行时,为 5.1、6.1 和 7.0 构建都会产生相同的结果。

self.edgesForExtendedLayout = UIRectEdgeNone

什么都不做。使用布局增量值不会做任何事情。在 IB 中,当“查看”为 iOS 7 和 iOS 6 及更早版本时,视图看起来相同。我打印了很多调试信息,但是当视图“移出屏幕”时,视图(或滚动视图)似乎没有任何变化。

显示覆盖信息的代码(在视图首次显示和单击时运行)是:

- (void) showOverlayInfo 
    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
    [[[self navigationController] navigationBar] setTranslucent:YES];
    [[self navigationController] setNavigationBarHidden:NO animated:NO];    

    overlayInfoHidden = NO;
    overlayInfoFading = NO;
    self.infoButton.hidden = NO;
    self.infoButton.alpha = 1;
    self.descriptionLabel.hidden = NO;
    self.descriptionLabel.alpha = 1;

隐藏叠加信息的代码是:

- (void) hideOverlayInfo 
    overlayInfoHidden = YES;
    overlayInfoFading = NO;
    self.infoButton.hidden = YES;
    self.descriptionLabel.hidden = YES;
    [[self navigationController] setNavigationBarHidden:YES animated:YES];

那么谁能告诉我我缺少什么(可能很简单)?

【问题讨论】:

【参考方案1】:

我终于找到了我的问题。

关键事实是图像查看器视图控制器位于 UIPageViewController 中, 所以我正在查看和尝试的实际上是另一个视图控制器的“内部”。 虽然我为图像查看器 VC 禁用了视图控制器设置 Adjust Scroll View Insets,但我还没有为创建 UIPageViewController 的包含 VC 执行此操作,并且 UIPageViewController 在某个子类中显示页面UIScrollView。当我为父 VC 更改它们时,问题就消失了。

所以我认为这个故事的寓意是:

当本地不起作用时,更全面地考虑问题,因为您可能错过了一些重要的背景。 如果您不想使用 iOS 7 行为,请更改您拥有的每个视图控制器的设置!

【讨论】:

以上是关于隐藏导航栏将视图“向上”移动的主要内容,如果未能解决你的问题,请参考以下文章

导航栏将文本视图中的文本向下移动 2 倍其高度

隐藏导航栏时UIButton向上移动

我的导航栏将不清晰。

隐藏状态栏时,我的导航栏在 iOS7 中向上移动

隐藏导航栏使视图中的所有内容变短

导航控制器弹出动画时导航栏向上移动