使用 UINavigationController 滑动边缘时 CABasicAnimation 重置

Posted

技术标签:

【中文标题】使用 UINavigationController 滑动边缘时 CABasicAnimation 重置【英文标题】:CABasicAnimation resets when edge swiping with UINavigationController 【发布时间】:2015-11-08 18:32:47 【问题描述】:

我在viewDidLoad 中运行了以下CABasicAnimation,用于UINavigationController 内的视图控制器:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.duration = 1;
animation.additive = NO;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
animation.fromValue = [NSNumber numberWithFloat:0];
animation.toValue = [NSNumber numberWithFloat:-1*(((-windBearing+180) * M_PI) / 180)];
[compass.layer addAnimation:animation forKey:@"90rotation"];

当我使用边缘滑动手势慢慢向后导航时,动画会重置为初始状态,这很不和谐。我的fillMode 设置和removedOnCompletion 设置为NO,我错过了什么?

【问题讨论】:

【参考方案1】:

设置fillModeremovedOnCompletion 的整个技巧是无稽之谈 - 这是一个糟糕的建议,它已经在很多答案中发挥作用,但它是完全错误的。动画是一回事。指南针层的实际变换是另一个。您已应用动画,但忘记设置transform 以匹配它。因此,当手势开始并从图层中移除动画时,指南针会以其实际旋转显示(并且变化显示为跳跃)。

【讨论】:

" 这是一个糟糕的建议,它已经在很多答案中发挥作用,但它是完全错误的。" +1000!如果这是教堂,我会说阿门! 什么意思?我需要在哪里设置转换? 我认为如果没有居高临下的第一句话,这个答案会更好。 @JohnGibb 我很好,继续把它拿出来。【参考方案2】:

感谢上面的马特,我意识到我错过了以下行:

compass.transform = CGAffineTransformMakeRotation(-1*(((-windBearing+180) * M_PI) / 180));

【讨论】:

以上是关于使用 UINavigationController 滑动边缘时 CABasicAnimation 重置的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationcontroller 中未使用的视图会发生啥?

使用 push segue 时 UINavigationController 是不是强制

UINavigationController - 使用 UIBlurEffect 清除背景

一起使用 UITabBarController 和 UINavigationController

iPhone - UINavigationController - 使用 CATransaction 自定义动画

如何在 SwiftUI 中使用 UINavigationController