0

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

在此处输入图像描述

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 。这是一个错误吗?谢谢。

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

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

4

1 回答 1

0

我遇到了同样的问题,原因是您正在为 a 设置动画CATransform,这是在图层上而不是在视图上完成的,这就是为什么UIView.animateWithDuration不响应它

于 2015-11-09T08:27:01.933 回答