使用动画显示颜色顺序(Swift)

Use animations to show color sequence (Swift)

您好,我是 Swift 的新手,我想为 IPhone 创建一个颜色记忆游戏,您的应用程序会为您提供一系列颜色,您必须按右纽扣。每次按下前一个序列的右侧按钮时,序列就会变得越来越长。

我希望应用程序通过在按钮上使用动画来显示按下了哪个按钮。该序列将使按钮闪烁,然后用户可以重新创建序列。

我有一个执行 flash() 的方法,它是 class 的一部分,它是 UIButton

的扩展
 func flash() {

    let flash = CABasicAnimation(keyPath: "opacity")
    flash.duration = 0.2
    flash.fromValue = 1
    flash.toValue = 0.1
    flash.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    flash.autoreverses = true
    flash.repeatCount = 1

    layer.add(flash, forKey: nil)
}

当我对一系列按钮执行此方法时,它会同时闪烁写入该序列的所有按钮。这当然不是我想要的方式,我希望按钮一个接一个地闪烁。

//  ViewController.swift

import UIKit
import SpriteKit

class GameViewController: UIViewController {

var colorPattern = [Int]()

@IBOutlet weak var buttonGreen: UIButton!
@IBOutlet weak var buttonRed: UIButton!
@IBOutlet weak var buttonBlue: UIButton!
@IBOutlet weak var buttonYellow: UIButton!
var buttons = [UIButton]()

override func viewDidLoad() {
    super.viewDidLoad()
    buttons = [buttonGreen, buttonRed, buttonBlue, buttonYellow]
    colorPattern = [0, 1, 2, 0, 1, 2]
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func colorButtonTouched(_ sender: UIButton) {
    print("button touched: ", sender.titleLabel!.text!)
    //sender.flash()
    doPattern()
}


func doPattern() {
    UIView.animateKeyframes(withDuration: 1, delay: 0, options: [.calculationModeCubic], animations: {
        // Add animations
        for index in self.colorPattern{
            print(index);
            UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 1, animations: self.buttons[index].flash)
        }
    }, completion:{ _ in
        print("I'm done!")
    })
}
}

当我执行此代码时,按钮 1、2 和 3 同时闪烁。有没有办法来解决这个问题?或者动画不是循环序列的正确方法。

试试这个

var currentButtonIndex = 0
func doPattern()
{
    let currentButton = self.buttons[self.currentButtonIndex]
    UIView.animateKeyframes(withDuration: 1, delay: 0, options: [.autoreverse], animations: {
        currentButton.alpha = 0
    }) { (complete) in
        currentButton.alpha = 1
        if self.currentButtonIndex == self.buttons.count - 1
        {
            self.currentButtonIndex = 0
            return
        }

        self.currentButtonIndex += 1
        self.doPattern()
    }
}