为什么在 viewWillTransitionToSize 中检索 SafeAreaInsets 的逻辑有点错误?

Why is the logic of retrieving SafeAreaInsets in `viewWillTransitionToSize` slightly wrong?

我正在探索从纵向旋转到横向时是否可以在 viewWillTransitionToSize 中预先知道风景“安全区域插图”。

我看过这个 SO 答案,它的代码相当伪代码:

在我的 iPhone XR 插图中,{48, 0, 34, 0} 用于纵向,{0, 48, 21, 48} 用于横向。 像这样:

旋转设备时 - 从纵向到横向 - 我在 animateAlongsideTransition 中记录了“未来”插图,它们是正确的。 问题是,为什么那些正确的值是从 FromViewControllerKey 中检索的,而不是从 ToViewControllerKey:

中检索的
- (void)logSafeAreaInsets:(id<UIViewControllerTransitionCoordinatorContext>)context
{
    UIInputViewController* vcFrom = [context viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIEdgeInsets iiFrom = vcFrom.view.safeAreaInsets;
    UIInputViewController* vcTo = [context viewControllerForKey:UITransitionContextToViewControllerKey];
    UIEdgeInsets iiTo = vcTo.view.safeAreaInsets;
    NSLog(@"TADAM from=%@ to=%@", NSStringFromUIEdgeInsets(iiFrom), NSStringFromUIEdgeInsets(iiTo));
}

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
        
        [self logSafeAreaInsets:context];
        
    } completion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
            
    }];
}

ToViewControllerKey 他们是 {0, 0, 0, 0} ! 日志如下所示:

TADAM from={0, 48, 21, 48} to={0, 0, 0, 0}

据我了解,ToViewControllerKey是风景VC(旋转后),FromViewControllerKey是肖像VC(旋转前)。

所以我可以得到我想要的UIViewControllerTransitionCoordinatorContext,但是它的逻辑似乎是错误的:

  1. 为什么真正的景观插图是从 FromVC 中检索的,而不是从 ToVC 中检索的?
  2. 为什么 ToVC 的插图在 animateAlongsideTransition 中为零?

好吧,逻辑不是“有点错误”,只是没有记录。 事实证明,vcTo 在我的代码中是 nil。所以插图是 zerovcTo 为 nil,因为屏幕旋转动画只用一个 VC 完成,这与例如pushing/presenting 新 VC.

时的过渡动画

我猜 vcFrom 已经 Landscape 插入到 animateAlongsideTransition 中,因为 model layer treepresentation layer tree 之间存在差异 - 而我没有还不知道如何检验这个假设。