Swift: 按下按钮时更改 UIButton backgroundColor?

Swift: Change UIButton backgroundColor when button is pressed?

我正在尝试创建一个由两个按钮(假按钮和真按钮)组成的测验应用程序。我的问题是,当我按下两个按钮之一时,我希望它在按下时仅在短时间内更改其背景颜色,然后我希望它恢复到原来的颜色,但我不知道如何更改背景颜色很快。到目前为止,这是这部分的代码:

@IBAction func answerButtonPressed(_ sender: UIButton) {
        
        let userAnswer = sender.currentTitle
        let actualAnswer = quiz[questionNumber].answer
        
        
        if userAnswer == actualAnswer {
            sender.backgroundColor = UIColor.green
        } else {
            sender.backgroundColor = UIColor.red
         }
        
        if questionNumber + 1 < quiz.count {
        
        questionNumber += 1
            }
        else {
            questionNumber = 0
        }
        updateUI()
        
        
        }
        
    func updateUI() {
        questionLabel.text = quiz[questionNumber].text
        trueButton.backgroundColor = UIColor.clear
        falseButton.backgroundColor = UIColor.clear

    

}

你可以试试

// add this code snippet outside of any class 
extension UIButton {
  func shortChangeTo(_ color:UIColor) {
    let prev = self.backgroundColor
    self.backgroundColor = color
    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
       self.backgroundColor = prev
    }
  }
}

使用它

if userAnswer == actualAnswer {
   sender.shortChangeTo(.green)
} else {
   sender.shortChangeTo(.red)
}

并改变

updateUI()

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
  self.updateUI()
}

这是 UIButton 扩展,带有动画的短时间颜色更改背景。

extension UIButton {
    func shortChangeBackground(with color: UIColor) {
        let originalColor = self.backgroundColor
        
        UIView.animate(withDuration: 0.3) {
            self.backgroundColor = color
        }
        
        UIView.animate(withDuration: 0.3, delay: 1.0) {
            self.backgroundColor = originalColor
        }
    }
}

使用:

@IBAction func onDoneAction(_ sender: UIButton) {
    sender.shortChangeBackground(with: userAnswer == actualAnswer ? UIColor.green : UIColor.red)
}

这将帮助您将按钮颜色更改为您想要的颜色(绿色或红色或其他颜色)并延迟 0.2 秒将其更改回清除。以最简单的方式。

在答案检查完成后,在 answerButtonPressed 的 IBAction 中放置以下行。

Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(updateUI), userInfo: nil, repeats: false)

在选择器中,指定用于更新用户界面的函数。

在这种情况下,以下是最快最简单的解决方案:

只需按如下方式更改 'updateUI ()' 函数:

func updateUI() {
        questionLabel.text = quiz[questionNumber].text
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
            self.trueButton.backgroundColor = UIColor.clear
            self.falseButton.backgroundColor = UIColor.clear
        }
        
    }

那么这里发生了什么?

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) 

在将背景更改回清晰颜色之前,上面的代码行将 green/red 颜色保持 0.3 秒(您可以根据自己的喜好更改此数字)。