viewDidLayoutSubviews iOS 8的无限循环

问题描述 投票:8回答:4

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

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

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

它持续运行并且没有停止。

有人有同样的问题吗?请帮忙 :(

谢谢!

ios objective-c xcode ipad ios8
4个回答
4
投票

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

viewWillLayoutSubviews;
viewDidLayoutSubviews;

如果你把东西改成了最后一个,它会再次调用它;


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
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.