[英]viewWillTransitionToSize safeArea and presentViewController
在屏幕旋轉時,我需要重新計算內部視圖。 我在那里嵌入了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也位於后台。 現在,嘗試旋轉屏幕會導致如下情況:layoutIfNeeded之后mainScroll的大小比沒有彈出控制器時高20點。 似乎safeArea指南/約束沒有在后台應用。 關閉彈出控制器后,mainScroll超出了預期,並且視圖錯位了……有什么提示嗎?
為什么“ presentViewController”會影響調用者在viewWillTransitionToSize方面的行為?
為了解決我遇到的以下挑戰:
- (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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.