首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >viewWillTransitionToSize safeArea和presentViewController

viewWillTransitionToSize safeArea和presentViewController
EN

Stack Overflow用户
提问于 2018-09-18 15:34:17
回答 1查看 585关注 0票数 0

在屏幕旋转时,我需要重新计算内部视图。我在那里嵌入了一个UIViewController和UIScrollView。内部视图取决于ScrollView帧的大小。

因此,在UIViewController中,我有以下代码:

代码语言:javascript
复制
- (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约束,一切都很好。

现在,代码中的某个地方有一个弹出控制器,名为

代码语言:javascript
复制
[self presentViewController:controllerToPresent animated:NO completion:nil];

没有什么是有趣的,但是这个呈现的控制器位于另一个控制器之上,我在前面描述过,mainScroll也在后台。现在,尝试旋转屏幕会导致mainScroll在layoutIfNeeded之后的大小比没有弹出控制器的情况高20点。看起来,就像safeArea指南/约束在后台没有应用一样。关闭弹出控制器后,mainScroll比预期的要大,我有错误的视图.有什么暗示吗?

为什么"presentViewController“会影响来电者在viewWillTransitionToSize方面的行为?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-24 09:14:06

为了应对这一挑战,我提出了以下解决方案:

代码语言:javascript
复制
- (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 (即当屏幕旋转时不再调用)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52390095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档