为啥 `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
。所以插图是zero
。
vcTo
为零,因为屏幕旋转动画仅使用一个 VC
完成,不像例如推送/呈现新 VC
时的过渡动画。
我猜vcFrom
已经在animateAlongsideTransition
中插入了Landscape
,因为model layer tree
和presentation layer tree
存在差异——虽然我还不知道如何检查这个假设。
【讨论】:
以上是关于为啥 `viewWillTransitionToSize` 中检索 SafeAreaInsets 的逻辑略有错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?