在屏幕旋转时,我需要重新计算内部视图。我在那里嵌入了一个UIViewController和UIScrollView。内部视图取决于ScrollView帧的大小。
因此,在UIViewController中,我有以下代码:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator {
DDLogDebug(@">>>>>>>>>>>>> %@", NSStringFromCGSize(size));
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
DDLogDebug(@"+++++++++ mainScroll %@", NSStringFromCGRect(_mainScroll.frame));
CGRect newFrame = CGRectMake(0, 0, size.width, size.height);
self.view.frame = newFrame;
[self.view.layer layoutIfNeeded];
DDLogDebug(@"--------- mainScroll %@", NSStringFromCGRect(_mainScroll.frame));
// and update the children
}
completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
}];
}到目前一切尚好。我看到,在将帧的手动大小设置为控制器的视图并调用layoutIfNeeded (或layoutSubviews -相同的结果)之后,mainScroll大小被正确地调整,包括考虑safeArea约束,一切都很好。
现在,代码中的某个地方有一个弹出控制器,名为
[self presentViewController:controllerToPresent animated:NO completion:nil];没有什么是有趣的,但是这个呈现的控制器位于另一个控制器之上,我在前面描述过,mainScroll也在后台。现在,尝试旋转屏幕会导致mainScroll在layoutIfNeeded之后的大小比没有弹出控制器的情况高20点。看起来,就像safeArea指南/约束在后台没有应用一样。关闭弹出控制器后,mainScroll比预期的要大,我有错误的视图.有什么暗示吗?
为什么"presentViewController“会影响来电者在viewWillTransitionToSize方面的行为?
发布于 2018-09-24 09:14:06
为了应对这一挑战,我提出了以下解决方案:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator {
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
[self updateLayoutAfterRotation:size];
}
completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
}];
}
- (void)viewSafeAreaInsetsDidChange {
[super viewSafeAreaInsetsDidChange];
[self updateLayoutAfterRotation:self.view.frame.size];
}
- (void)updateLayoutAfterRotation:(CGSize)size {
CGRect newFrame = CGRectMake(0, 0, size.width, size.height);
self.view.frame = newFrame;
[self.view.layer layoutIfNeeded];
// Here is custom code to adopt layout
}有趣的是,当这个viewController自己旋转(屏幕上的顶部视图)时,首先接收到viewSafeAreaInsetsDidChange,然后是viewWillTransitionToSize。但是,如果控制器的视图隐藏在弹出控制器后面,则调用顺序将相反。当弹出控制器关闭时,首先调用viewSafeAreaInsetsDidChange (即当屏幕旋转时不再调用)。
https://stackoverflow.com/questions/52390095
复制相似问题