为啥 `viewWillTransitionToSize` 中检索 SafeAreaInsets 的逻辑略有错误?

Posted

技术标签:

【中文标题】为啥 `viewWillTransitionToSize` 中检索 SafeAreaInsets 的逻辑略有错误?【英文标题】:Why is the logic of retrieving SafeAreaInsets in `viewWillTransitionToSize` slightly wrong?为什么 `viewWillTransitionToSize` 中检索 SafeAreaInsets 的逻辑略有错误? 【发布时间】:2021-07-17 12:17:20 【问题描述】:

我正在探索在从纵向旋转到横向时,viewWillTransitionToSize 中是否可以准确地知道景观“安全区域插图”。

我看过这个 SO 答案,它的代码是一个伪代码:https://***.com/a/46581783/2567725

在我的 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,但是它的逻辑似乎是错误的:

    为什么从FromVC而不是ToVC检索真正的风景插图? 为什么ToVC 的插入在animateAlongsideTransition 中为零?

【问题讨论】:

【参考方案1】:

嗯,逻辑不是“有点错误”,只是没有记录。 事实证明,vcTo 在我的代码中是 nil。所以插图是zerovcTo 为零,因为屏幕旋转动画仅使用一个 VC 完成,不像例如推送/呈现新 VC 时的过渡动画。

我猜vcFrom 已经在animateAlongsideTransition 中插入了Landscape,因为model layer treepresentation layer tree 存在差异——虽然我还不知道如何检查这个假设。

【讨论】:

以上是关于为啥 `viewWillTransitionToSize` 中检索 SafeAreaInsets 的逻辑略有错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?