UIButton / UIView.animate使按钮依次闪烁

问题描述 投票:1回答:1

我正在快速制作一个Simon游戏,其中信号以枚举[Green,Yellow,Red,Red,Blue]给出...我想让按钮在信号发出时闪烁。我用来使按钮闪烁的代码是

extension UIButton {
    func blink() {
        self.alpha = 0.0;
        UIView.animate(withDuration: 0.6, //Time duration you want,
            delay: 0.0,
            options: [.curveEaseInOut, .autoreverse],
            animations: { [weak self] in self?.alpha = 1.0 },
            completion: { [weak self] _ in self?.alpha = 1.0 })
    }
}

并且在我的给定信号功能中,我正在执行

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

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

但是,例如,如果信号指定为[绿色,黄色,红色],则所有绿色,黄色,红色按钮会同时闪烁。如何解决此问题,使按钮一个接一个闪烁?

ios swift xcode
1个回答
0
投票

首先,将完成处理程序添加到blink,因为我们将仅在前一次闪烁完成后才开始下一个闪烁。

extension UIButton {
    func blink(completion: @escaping () -> Void) {
        self.alpha = 0.0;
        UIView.animate(withDuration: 0.6, //Time duration you want,
            delay: 0.0,
            options: [.curveEaseInOut],
            animations: { self.alpha = 1.0 },
            completion: { _ in
                UIView.animate(withDuration: 0.6,
                    delay: 0.0,
                    options: [.curveEaseInOut],
                    animations: { self.alpha = 0.0 },
                    completion: { _ in completion() })
             })
    }
}

然后编写一个包含[Block]和索引的函数,该函数使该索引处的按钮闪烁。请注意,我如何通过再次调用blink(at:in:)的闭包作为blink()调用的完成:

func blink(at index: Int, in signals: [Block]) {
    guard index < signals.count else { return }
    let completion = { blink(at: index + 1, in: signals) }

    switch (signals[index]) {
        case .green: green.blink(completion: completion)
        case .red: red.blink(completion: completion)
        case .yellow: yellow.blink(completion: completion)
        case .blue: blue.blink(completion: completion)
    }
}

现在,我们可以重写giveSignal

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
        }

    }
    blink(at: 0, in: signals) // This starts the sequence of blinks
    let finalSeq:String = makeString()
    statusBar.text = finalSeq
}
© www.soinside.com 2019 - 2024. All rights reserved.