iOS 8 的 viewDidLayoutSubviews 无限循环
Posted
技术标签:
【中文标题】iOS 8 的 viewDidLayoutSubviews 无限循环【英文标题】:viewDidLayoutSubviews infinite loop with iOS 8 【发布时间】:2014-09-17 03:17:02 【问题描述】:我有一个通用 ios 项目,可以完美运行 Xcode 5(iOS 6 和 iOS 7)。我为 iPad 和 iPhone 使用不同的故事板。
当我使用 Xcode 6 GM 运行它时,它可以完美地与 iPhone 配合使用,但不适用于 iPad。我调试后发现 UISplitViewController 中的 viewDidLayoutSubviews 有问题。例如:
- (void)viewDidLayoutSubviews
[super viewDidLayoutSubviews];
NSLog(@"run");
// some config with frame of child controllers
它一直在运行,没有停止。
有人有同样的问题吗?请帮忙:(
谢谢!
【问题讨论】:
【参考方案1】:您在子控制器的 viewDidLayoutSubviews 覆盖中的代码本身正在修改视图的子视图,因此触发 viewDidLayoutSubviews 被一次又一次地调用。
为防止这种情况发生,请尝试将 BOOL 属性添加到您的 UISplitViewController 以控制子控制器布局代码的执行。
@interface UISplitViewController()
...
@property (nonatomic) BOOL subViewLayoutCalled;
...
@end
然后在你的 viewDidLayoutSubviews...
- (void)viewDidLayoutSubviews
[super viewDidLayoutSubviews];
NSLog(@"run");
if (!self.subViewLayoutCalled)
self.subViewLayoutCalled = YES;
// some config with frame of child controllers
值得一试。
我最近遇到了同样的问题。
【讨论】:
【参考方案2】:我所看到的是,每次您更改视图中元素的布局时,它都会调用以下方法:
viewWillLayoutSubviews;
viewDidLayoutSubviews;
如果你把某个东西改成最后一个,它会再次调用它;
【讨论】:
【参考方案3】:我有同样的问题 - 用它来调整 UISplitViewCtrl 中的主/细节。
要更改大小主/细节,请尝试在 ios8 中使用这个新参数,例如 viewDidLoad:
self.minimumPrimaryColumnWidth = 500;
self.maximumPrimaryColumnWidth = 500;
self.preferredPrimaryColumnWidthFraction = 1;
【讨论】:
【参考方案4】:我喜欢在拆分视图控制器子类中使用此方法:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context)
completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context)
// adjust column sizes based on size param
// e.g. call same method called by viewDidLoad
];
它们应该是可动画的,但根据我的经验,它们在 animateAlongsideTransition 中设置时不会动画,可能是因为在旋转或多任务调整大小期间已经发生了太多事情。因此,为什么我只是在完成时这样做。
【讨论】:
以上是关于iOS 8 的 viewDidLayoutSubviews 无限循环的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 和 iOS 8 中的警报视图与 UIAlertController
在 ios 8 中以横向模式隐藏并在 xCode 6 中发布 ios 8 后尝试在 ios 7 中正常工作的状态栏问题