我有一个在 UIStoryboard 中使用 UITableView 设置的视图控制器。UITableView 在所有四个边上都被限制在控制器的 SafeArea 中。
这个问题好像以前也有人问过,但是每次我发现这个问题,都是因为viewDidLayoutSubviews发生了变化,导致了循环的发生。我有 viewDidLayoutSubviews 和基本 UITableViewCells 的空白实现(无笔尖)。然而在 iOS 11、Xcode 9.2 中,向上轻弹 tableview 会导致 viewDidLayoutSubviews 在无限循环中被调用。这是我的实现:
- (void)viewDidLayoutSubviews {
NSLog(@"viewDidLayoutSubviews");
[super viewDidLayoutSubviews];
}
我一生都无法弄清楚这是怎么发生的。
编辑:控制器有一个 NavigationController 并且是 UISplitViewController 的主控制器,它嵌入在 BannerViewController 中(来自 iAdSuite 示例)。
编辑:这发生在模拟器上所有设备的 iOS 11(直到 11.2)上。不会发生 iOS 10.3。viewDidLayoutSubviews
在 iOS 10.3 中甚至没有调用。当我简单地使用导航控制器和 UIViewController/TableView 代替 UISplitViewController/BannerViewController 时,我得到了相同的结果。所以似乎这个问题不是在那里介绍的,而是来自 iOS 11 中正在发生的事情。
编辑:所以这很奇怪 - 似乎只有在为导航控制器选择大标题时才会发生!
if (@available(iOS 11.0, *)) {
self.navigationController.navigationBar.prefersLargeTitles = YES;
self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAlways;
}
编辑:这个问题很容易重现。我下载了 Apple 的 iAd Suite 示例代码,并使用了 SplitNavigationController 项目。我更新了 iOS 11 的项目,包括更新故事板以使用安全区域布局指南。我将 MasterViewController 从 UITableViewController 更改为带有 UITableView 的 UIViewController,我将其限制为情节提要中的安全区域布局指南。我在 MasterViewController 中添加了 prefersLargeTitles 和 largeTitleDisplayMode。我在 viewDidLayoutSubviews 方法中添加了一个 NSLog 语句,因此可以很容易地观察到这种行为。我认为这是 iOS 11 的一个真正问题,我将尝试深入了解它,如果其他人可以提供任何想法或建议,我也将不胜感激。
编辑:matt 能够重现此问题并将其发布在 GitHub 项目中,可在以下链接中找到(感谢 matt!):InfiniteLayoutSubviewsBug