为什么在 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
,但是它的逻辑似乎是错误的:
- 为什么真正的景观插图是从
FromVC
中检索的,而不是从 ToVC
中检索的?
- 为什么
ToVC
的插图在 animateAlongsideTransition
中为零?
好吧,逻辑不是“有点错误”,只是没有记录。
事实证明,vcTo
在我的代码中是 nil
。所以插图是 zero
。
vcTo
为 nil,因为屏幕旋转动画只用一个 VC
完成,这与例如pushing/presenting 新 VC
.
时的过渡动画
我猜 vcFrom
已经 Landscape
插入到 animateAlongsideTransition
中,因为 model layer tree
和 presentation layer tree
之间存在差异 - 而我没有还不知道如何检验这个假设。
我正在探索从纵向旋转到横向时是否可以在 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
,但是它的逻辑似乎是错误的:
- 为什么真正的景观插图是从
FromVC
中检索的,而不是从ToVC
中检索的? - 为什么
ToVC
的插图在animateAlongsideTransition
中为零?
好吧,逻辑不是“有点错误”,只是没有记录。
事实证明,vcTo
在我的代码中是 nil
。所以插图是 zero
。
vcTo
为 nil,因为屏幕旋转动画只用一个 VC
完成,这与例如pushing/presenting 新 VC
.
我猜 vcFrom
已经 Landscape
插入到 animateAlongsideTransition
中,因为 model layer tree
和 presentation layer tree
之间存在差异 - 而我没有还不知道如何检验这个假设。