0

a 的动画UIView应该在视图添加到父视图后立即开始:

class myView: UIView {
    override func didMoveToSuperview() {
        super.didMoveToSuperview()

        UIView.animate(
            withDuration: duration,
            delay: 0,
            options: .curveLinear,
            animations: {
                CATransaction.begin()
                CATransaction.setAnimationDuration(duration)
                self.layer.colors = [color1, color2]
                CATransaction.commit()
        },
            completion: nil
        )
    }
}

但是,结果是当视图在父视图中可见时动画已经结束。UIView.animate不动画但立即设置,可能是因为视图在被调用self.layer.colors时还不可见。didMoveToSuperview

如何让动画正常启动?

4

1 回答 1

2

使用核心动画制作渐变动画可以通过创建一个CABasicAnimation并将其添加到您的CAGradientLayer. 您不需要将其包装在UIView动画块中,只要viewDidMoveToSuperviewUIView根视图添加到UIWindow. 例如,在操场上可以写:

import UIKit
import PlaygroundSupport

class MyView: UIView
{
    var duration = 20.0

    var fromColors = [UIColor.orange.cgColor, UIColor.blue.cgColor]
    var toColors = [UIColor.red.cgColor, UIColor.green.cgColor]

    override func didMoveToSuperview() {
        super.didMoveToSuperview()

        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = bounds
        layer.addSublayer(gradientLayer)

        let animation = CABasicAnimation(keyPath: "colors")
        animation.fromValue = fromColors
        animation.toValue = toColors
        animation.duration = duration
        gradientLayer.add(animation, forKey: nil)

        gradientLayer.colors = toColors
    }
}

class ViewController: UIViewController
{
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let myView = MyView(frame: view.bounds)
        view.addSubview(myView)
    }
}

PlaygroundPage.current.liveView = ViewController()

并查看从垂直橙色到蓝色渐变的 20 秒动画动画到垂直红色到绿色渐变。

于 2017-07-01T23:53:15.437 回答