簡體   English   中英

Swift 閃爍 UIButtons(不點擊)

[英]Swift blink UIButtons (not on tap)

我正在嘗試在 swift 中制作一個 simon memory 游戲,其中 4 個按鈕依次閃爍,用戶必須記住順序和猜測。 現在我正在生成類似 [Green, Red, Green, Blue, Yellow] 的隨機序列,當我生成這些時,我想讓綠色按鈕閃爍,然后是紅色,然后是綠色,等等。 我該怎么做呢?

    @IBOutlet weak var green: UIButton!
    @IBOutlet weak var red: UIButton!
    @IBOutlet weak var yellow: UIButton!
    @IBOutlet weak var blue: UIButton!
    enum Block {
        case green
        case red
        case yellow
        case blue
    }

    //Block button action
    @IBAction func greenButton() {
        if playerTurn && (blocksPressed < signals.count ){
            blocksPressed += 1
            guesses.append(Block.green)
            guess()
        }
    }

    @IBAction func redButton() {
        if playerTurn && (blocksPressed < signals.count) {
            blocksPressed += 1
            guesses.append(Block.red)
            guess()
        }
    }

    @IBAction func yellowButton() {
        if playerTurn && (blocksPressed < signals.count) {
            blocksPressed += 1
            guesses.append(Block.yellow)
            guess()
        }
    }

    @IBAction func blueButton() {
        if playerTurn && (blocksPressed < signals.count ){
            blocksPressed += 1
            guesses.append(Block.blue)
            guess()
        }
    }
    let randomSource = GKARC4RandomSource() //for random number generation
    var signals:[Block] = []

    func giveSignal() {
        disableButton()
        signals = []
        for _ in 0...levelNum  {
            let randomSignal:Int = randomSource.nextInt(upperBound: 4)
            switch randomSignal {
                //Green
                case 0:
                    signals.append(Block.green)
                //Red
                case 1:
                    signals.append(Block.red)
                //Yellow
                case 2:
                    signals.append(Block.yellow)
                //Blue
                case 3:
                    signals.append(Block.blue)
            default:
                break
            }

        }
        let finalSeq:String = makeString()
        statusBar.text = finalSeq
    }

這是偽代碼。

有兩個部分。

首先,animation。 您應該使用 KeyFrame animation。

這是相應的蘋果文檔

其次,Block 枚舉的信號,你應該消費它。

這里有點棘手,算法有點。

switch case適合您。

       let blink: (Block) -> Void = {(option) in
            switch option {
            case .green:
                self.green.backgroundColor = UIColor.green
            case .red:
                self.red.backgroundColor = UIColor.red
            case .yellow:
                self.yellow.backgroundColor = UIColor.yellow
            case .blue:
                self.red.backgroundColor = UIColor.blue
            }
        }


        let total: TimeInterval = 1.2

        UIView.animateKeyframes(withDuration: total, delay: 0, options: .repeat, animations: {
            let proportion: TimeInterval = 0.25
            UIView.addKeyframe(withRelativeStartTime: total * proportion * 0, relativeDuration: total * proportion) {
                blink(self.signals.removeFirst())
            }
            UIView.addKeyframe(withRelativeStartTime: total * proportion * 1, relativeDuration: total * proportion) {
                blink(self.signals.removeFirst())
            }

            UIView.addKeyframe(withRelativeStartTime: total * proportion * 2, relativeDuration: total * proportion) {
                blink(self.signals.removeFirst())
            }

            UIView.addKeyframe(withRelativeStartTime: total * proportion * 3, relativeDuration: total * proportion) {
                blink(self.signals.removeFirst())
            }

        }) { (_) in }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM