簡體   English   中英

viewWillTransitionToSize safeArea和presentViewController

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM