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 9 项目支持 iOS 8

iOS 7 和 iOS 8 中的警报视图与 UIAlertController

在 ios 8 中以横向模式隐藏并在 xCode 6 中发布 ios 8 后尝试在 ios 7 中正常工作的状态栏问题

iOS 7教程学习iOS 8?

iOS 8、iOS 9、iOS 10 和 iOS 11 上的 UITabBar 的高度是多少?

拨出电话时的后台行为,iOS 7 与 iOS 8