通常的故事 - 我正在使iOS 5/6应用程序在iOS 7下运行,导航栏行为更改导致问题。
该应用程序已经像iOS 7默认一样工作,具有全屏视图和视图"上方"的半透明导航栏。 问题是隐藏/取消隐藏导航栏会导致iOS 7中的不同行为。 在iOS 5/6上,隐藏/取消隐藏导航栏不会更改视图。 在 iOS 7 上,隐藏栏在视觉上会向上移动视图,在屏幕底部留下一个空白栏,取消隐藏栏会将视图向下移动以占据全屏(当然,导航栏位于顶部)。
我需要继续支持 iOS 5,所以我不使用自动布局,但我确实使用全屏。我有一个视图,我正在其中查看可缩放的图像 - 因此视图控制器具有包含滚动视图的全屏视图,其中包含图像视图。
状态栏始终处于隐藏状态。
我通过导航控制器到达视图控制器,因此有一个(黑色,半透明)导航栏位于我的全屏视图/滚动视图/图像视图的顶部。
短暂延迟后,一些叠加标签会褪色,导航栏被隐藏只需点击一下即可恢复叠加标签并取消隐藏导航栏。这适用于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];
}
那么谁能告诉我我错过了什么(大概很简单)的东西?
我终于找到了我的问题。
关键事实是图像查看器视图控制器位于UIPageViewController中,所以我正在观察和试验的是真正"内部"另一个视图控制器。虽然我已经为图像查看器 VC 禁用了视图控制器设置调整滚动视图插图,但我还没有为创建 UIPageViewController 的包含 VC 执行此操作,并且 UIPageViewController 在 UIScrollView 的某个子类中呈现页面。 当我为父 VC 更改它们时,问题消失了。
所以我认为这个故事的寓意是:
- 当本地不起作用时,更全面地考虑问题,因为您可能缺少一些重要的上下文。
- 如果您不想使用 iOS 7 行为,请更改您拥有的每个视图控制器的设置!