viewDidLayoutSubviews iOS 8的无限循环

时间:2014-09-17 03:17:02

标签: ios objective-c xcode ipad ios8

我有一个与Xcode 5(iOS 6和iOS 7)完美运行的通用iOS项目。 iPad和iPad使用不同的故事板iPhone。

当我使用Xcode 6 GM运行它时,它可以与iPhone完美配合,但不适用于iPad。我调试了我发现UISplitViewController中的viewDidLayoutSubviews存在问题。例如:

- (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; NSLog(@"run"); // some config with frame of child controllers }

它连续不断地停止。

任何人都有同样的问题?请帮忙:(

谢谢!

4 个答案:

答案 0 :(得分:4)

我看到的是每次在视图中更改元素的布局时,它会调用以下方法:

viewWillLayoutSubviews;
viewDidLayoutSubviews;

如果您将某些内容更改为最后一个,则会再次调用它;

答案 1 :(得分:3)

子控制器的viewDidLayoutSubviews覆盖中的代码本身正在修改视图的子视图,因此触发viewDidLayoutSubviews再次,再次,再次调用。

为防止这种情况,请尝试向UISplitViewController添加BOOL属性,以控制子控制器布局代码的执行。

@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 :(得分:2)

我有同样的问题 - 用它来调整UISplitViewCtrl中的主/细节。

要更改大小/详细信息,请在ios8中尝试此新参数,例如viewDidLoad:

self.minimumPrimaryColumnWidth = 500;
self.maximumPrimaryColumnWidth = 500;
self.preferredPrimaryColumnWidthFraction = 1;

答案 3 :(得分:0)

我喜欢在拆分视图控制器子类中使用此方法:

- (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中时,它们不会动画,这可能是因为在旋转或多任务调整大小期间已经发生了太多事情。因此,为什么我只在完成时这样做。