iOS:为啥动画在 CABasicAnimation 下运行良好,但在 animateWithDuration 下看起来很奇怪?

Posted

技术标签:

【中文标题】iOS:为啥动画在 CABasicAnimation 下运行良好,但在 animateWithDuration 下看起来很奇怪?【英文标题】:iOS: Why the animation runs well with CABasicAnimation but looks weird with animateWithDuration?iOS:为什么动画在 CABasicAnimation 下运行良好,但在 animateWithDuration 下看起来很奇怪? 【发布时间】:2015-08-25 07:33:16 【问题描述】:

这是一个使用动画旋转图像视图的简单演示。

class ViewController: UIViewController 

    @IBOutlet weak var imageView: UIImageView!

    @IBAction func left() 
        animateWithTransform(CATransform3DMakeRotation(CGFloat(M_PI_4), 0, 0, 1))
    

    @IBAction func right() 
        animateWithTransform(CATransform3DMakeRotation(CGFloat(-M_PI_4), 0, 0, 1))
    

    func animateWithTransform(transform: CATransform3D) 
        UIView.animateWithDuration(1) 
            self.imageView.layer.transform = transform
        
    

动画运行流畅。 将 right() 更新为:

@IBAction func right() 
    animateWithTransform(CATransform3DMakeRotation(CGFloat(-M_PI_4), 0, 1, 0))

点击左右,动画不再流畅。图像视图在开始动画之前跳转到一个角度。这是为什么呢?

更新 animateWithTransform() 以改用 CABasicAnimation:

func animateWithTransform(transform: CATransform3D) 
    let animation = CABasicAnimation(keyPath: "transform")
    animation.duration = 1
    animation.fromValue = NSValue(CATransform3D: imageView.layer.transform)
    animation.toValue = NSValue(CATransform3D: transform)
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
    imageView.layer.addAnimation(animation, forKey: nil)

    imageView.layer.transform = transform

动画又好了。

所以问题是为什么我不能在这里使用 animateWithDuration 。这是一个错误吗? 谢谢。

---- 更新 ----------------------------------

顺便说一句,图像视图以约束为中心。这可能是一个约束问题,我不确定。

【问题讨论】:

我也遇到了同样的问题,原因是你在为CATransform制作动画,这是在图层而不是视图上完成的,这就是UIView.animateWithDuration没有响应的原因跨度> @sken3r.MI 我认为你是对的!您可以将其发布为答案,然后我可以接受吗? 【参考方案1】:

我也遇到了同样的问题,原因是你在为CATransform制作动画,这是在图层而不是视图上完成的,这就是UIView.animateWithDuration没有响应的原因

【讨论】:

以上是关于iOS:为啥动画在 CABasicAnimation 下运行良好,但在 animateWithDuration 下看起来很奇怪?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:为啥动画在 CABasicAnimation 下运行良好,但在 animateWithDuration 下看起来很奇怪?

为啥要更改选项卡,停止 ios 应用程序中的动画?

为啥 iOS 动画第一次运行时会变慢?

结合 drawRect 和 KeyPathAnimation 来取消闪烁

为啥我的 CAShapeLayer 没有动画? (iOS 斯威夫特)

为啥我应该使用基于块的动画而不是开始/结束动画?