2017-07-01 29 views
0

一个UIView的动画应该开始的观点加入到上海华之后:添加视图后,为什么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时视图不可见。

如何让动画正常启动?

+0

在您的视图控制器的生命周期中,哪里是添加到视图层次结构中的MyView实例? – beyowulf

+0

@thefredelement覆盖任何绘图功能都没有帮助,相同的结果。 – Manuel

+0

@beyowulf在'super.viewDidAppear(动画)'后面。 – Manuel

回答

2

使用核心动画制作动画渐变可以通过创建CABasicAnimation并将其添加到CAGradientLayer来完成。您不需要将其包含在UIView动画块中,并且您可以从viewDidMoveToSuperview执行此操作,前提是您将根视图添加到UIWindow之后,将UIView子类实例添加到视图层次结构中。例如,在一个游乐场一个可以写成:

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第二动画到垂直红色到绿色梯度。

+0

谢谢,它现在工作正常。唯一要改变的是在添加动画'gradientLayer.add(animation,forKey:nil)'之前,应该设置最终状态'gradientLayer.colors = toColors'。否则,在连续动画时有时会闪烁。而且它甚至不再需要在'didMoveToSuperview'中启动动画,它也可以在'init'函数中使用。 – Manuel