2017-07-01 51 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