2017-05-01 63 views
0

我正在試圖製作一個動畫,其中屏幕上的顏色是紅色的脈衝,當屏幕被點擊時,脈衝的速度會增加。現在我有兩個問題。其一,是動畫不會發生,其次是動畫必須加速而不重新啓動動畫。我希望動畫能夠從屏幕點擊時的任何點進行加速。我無法讓這個CA動畫工作

class ViewController: UIViewController { 

var tapCount: Int = 0 
var pulseSpeed: Double = 3 
let pulseAnimLayer = CALayer() 
let pulseAnim = CABasicAnimation(keyPath: "Opacity") 

override func viewDidLoad() { 
    super.viewDidLoad() 

    counter.center = CGPoint(x: 185, y: 118) 

    pulseAnim.fromValue = 0.5 
    pulseAnim.toValue = 1.0 
    pulseAnim.duration = 3.0 
    pulseAnim.autoreverses = true 
    pulseAnim.repeatCount = .greatestFiniteMagnitude 
    pulseAnimLayer.add(pulseAnim, forKey: "Opacity") 
} 

func pulseAnimation(pulseSpeed: Double) { 
    UIView.animate(withDuration: pulseSpeed, delay: 0, 
     options: [UIViewAnimationOptions.repeat, UIViewAnimationOptions.autoreverse], 
     animations: { 
      self.red.alpha = 0.5 
      self.red.alpha = 1.0 
     } 
    ) 
} 

@IBOutlet weak var red: UIImageView! 
@IBOutlet weak var counter: UILabel! 

@IBAction func screenTapButton(_ sender: UIButton) { 
    tapCount += 1 
    counter.text = "\(tapCount)" 
    pulseSpeed = Double(3)/Double(tapCount) 
    pulseAnim.duration = pulseSpeed 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 
} 

回答

0

我第一次沒有仔細閱讀。

你有一個奇怪的混合核心動畫和UIView動畫。兩者存在於不同的層面。核心動畫將允許你在視圖上設置動畫屬性(比如說它是背景色)。

UIView動畫建立在覈心動畫之上,通過構建底層核心動畫可以更輕鬆地動畫化視圖更改。

當你創建一個CABasicAnimation但你有一個函數它看起來正在做一些使用UIVIew動畫的東西,你從核心動畫開始。我認爲你完全可以擺脫這個功能。

當您添加CABasicAnimation時,您告訴它更改圖層「不透明度」的值。你可能想要的是「不透明」(小寫)。

您的動畫正在應用於您創建的新CALayer ...但您似乎並未將該圖層放入視圖(因此它從未繪製過)。更可能的是你應該做的事情是把你的動畫附加到視圖的圖層上,並讓圖層具有彩色動畫效果。

要添加一層到另一個使用addSublayer(https://developer.apple.com/reference/quartzcore/calayer/1410833-addsublayer)。視圖的從你的代碼層應該作爲self.view.layer雖然你可能有viewWillAppear使用它,而不是在viewDidLoad

+0

我知道我需要這樣做。所有額外的東西與UIView動畫和pulseAnimation應該已被刪除。我沒有使用我最新版本中的那些。我只是不知道如何將CALayer放入視圖以及如何在該圖層上放置動畫。 –

+0

在關於如何將子圖層添加到視圖圖層的答案結尾添加了註釋。 –

0

您需要的動畫

func pulseAnimation(pulseSpeed: Double) { 


    UIView.animate(withDuration: pulseSpeed, delay: 1.0, 
        options: [UIViewAnimationOptions.repeat, UIViewAnimationOptions.autoreverse], 
        animations: { 
        self.red.alpha = 0.5 
        self.red.alpha = 1.0 
    } 
    ) 
} 

override func viewDidAppear(_ animated: Bool) { 

    self.red.alpha = 0.0 


    counter.center = CGPoint(x: 185, y: 118) 


} 
前紅色的ImageView的alpha設置爲0.0
+0

爲什麼在'UIView動畫「中設置兩次'alpha'?第一個將不起作用。 – rmaddy

+0

好吧,這是真的,但該代碼的一部分來自誰問這個問題,我沒有改變它 – DevB2F