Ios ui按钮/ui视图。设置动画使按钮按顺序闪烁

Ios ui按钮/ui视图。设置动画使按钮按顺序闪烁,ios,swift,xcode,Ios,Swift,Xcode,我正在用swift制作一个simon游戏,其中信号以enum[绿色、黄色、红色、红色、蓝色]给出。。。我想让按钮在信号发出时闪烁。我用来使按钮闪烁的代码是 扩展按钮{ func blink(){ self.alpha=0.0; UIView.animate(持续时间:0.6,//您想要的持续时间, 延迟:0.0, 选项:[.curveEaseInOut、.autoreverse], 动画:{self?.alpha=1.0}中的[弱自我], 完成:{[弱自]uuin self?.alpha=1.0

我正在用swift制作一个simon游戏,其中信号以enum[绿色、黄色、红色、红色、蓝色]给出。。。我想让按钮在信号发出时闪烁。我用来使按钮闪烁的代码是

扩展按钮{
func blink(){
self.alpha=0.0;
UIView.animate(持续时间:0.6,//您想要的持续时间,
延迟:0.0,
选项:[.curveEaseInOut、.autoreverse],
动画:{self?.alpha=1.0}中的[弱自我],
完成:{[弱自]uuin self?.alpha=1.0})
}
}
在我的give信号函数中,我正在做

func-giveSignal(){
禁用按钮()
信号=[]
对于0中的uu…levelNum{
//stopplingall()
让randomSignal:Int=randomSource.nextInt(上限:4)
开关随机信号{
//绿色的
案例0:
green.blink()
signals.append(Block.green)
//green.stoppling()
//红色的
案例1:
红色闪烁
signals.append(Block.red)
//红色
//黄色的
案例2:
黄色。闪烁()
信号。追加(块。黄色)
//黄色。停止闪烁()
//蓝色的
案例3:
blue.blink()
signals.append(Block.blue)
//蓝色。停止闪烁()
违约:
打破
}
}
让finalSeq:String=makeString()
statusBar.text=finalSeq
}

但如果给出的信号为[绿色、黄色、红色],例如,所有绿色、黄色、红色按钮同时闪烁。如何修复此问题以使按钮一个接一个地闪烁?

首先,向
闪烁添加一个完成处理程序,因为我们只在上一次闪烁完成后才开始下一次闪烁

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()
调用时,我如何再次传递调用
blink(at:in:)
的闭包:

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)
    }
}

首先,将完成处理程序添加到
闪烁
,因为我们只在上一次闪烁完成后才开始下一次闪烁

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()
调用时,我如何再次传递调用
blink(at:in:)
的闭包:

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)
    }
}

谢谢你,这很有效!另外,我的眨眼动画非常起伏,眨眼两次。你知道如何使它更干净吗?我只想眨眼。@JiwooLee显然是,
autoreverse
。因此,我认为您应该在
blink()
方法中运行两个动画,而不是使用
autoreverse
@JiwooLee查看编辑。我已将
blink
更改为不使用
autoreverse
。工作正常!再次感谢:)谢谢你,它起作用了!另外,我的眨眼动画非常起伏,眨眼两次。你知道如何使它更干净吗?我只想眨眼。@JiwooLee显然是,
autoreverse
。因此,我认为您应该在
blink()
方法中运行两个动画,而不是使用
autoreverse
@JiwooLee查看编辑。我已将
blink
更改为不使用
autoreverse
。工作正常!再次感谢:)