我有一个与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
}
它持续运行并且没有停止。
有人有同样的问题吗?请帮忙 :(
谢谢!
我看到的是每次在视图中更改元素的布局时,它将调用以下方法:
viewWillLayoutSubviews;
viewDidLayoutSubviews;
如果你把东西改成了最后一个,它会再次调用它;
您在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
}
}
值得一试。
我最近遇到了同样的问题。
我有同样的问题 - 用它来调整UISplitViewCtrl中的主/细节。
要更改主要/详细信息的大小,请在ios8中尝试此新参数,例如viewDidLoad:
self.minimumPrimaryColumnWidth = 500;
self.maximumPrimaryColumnWidth = 500;
self.preferredPrimaryColumnWidthFraction = 1;
我喜欢在拆分视图控制器子类中使用此方法:
- (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中设置时没有动画,可能是因为在旋转或多任务调整大小期间已经发生了太多事情。因此,为什么我只是在完成时这样做。