如何更改向 IBAction 注册的自定义 UIButton 的颜色?

How do I change the color of my custom UIButton's that is registered with IBAction?

我创建了一个名为 RegistrationButton 的自定义 UIButton。我目前正在尝试允许用户在三个按钮之间 select 。在按钮的 select 上,背景颜色和文本将发生变化。 这是 IBAction 的外观:

  @IBAction func didTapBUtton(_ sender: UIButton) {


  switch sender {
    case studentButton:
        studentButton.selected()
        professionalButton.notSelected()
        entrepreneurhsip.notSelected()
        break
    case professionalButton:
        studentButton.notSelected()
        professionalButton.selected()
        entrepreneurhsip.notSelected()
        break
    case entrepreneurhsipButton:
        studentButton.notSelected()
        professionalButton.notSelected()
        entrepreneurhsip.selected()
        break
    default:
        break
    }
}

这是我的自定义 UIButton class:

import UIKit

class RegistrationButton: UIButton {


override func awakeFromNib() {
    super.awakeFromNib()
    addBorder()

}

required init(coder:NSCoder) {
    super.init(coder:coder)!
}

func addBorder(){
    self.layer.borderColor = UIColor.white.cgColor
    self.layer.borderWidth = 1
}

func selected(){
     self.backgroundColor = .white

    self.setTitleColor(UIColor(red:67,green:204,blue:144,alpha:1), for: .normal)
}
func notSelected(){

    self.backgroundColor = UIColor(red:67,green:204,blue:144,alpha:1)


    self.setTitleColor(UIColor.white, for: .normal)
}

}

但是,当我select在一个按钮上时,所有按钮的背景都变成了白色。

rgb 值必须是 01 之间的浮点数。您只需要将所有参数除以 255 即可。

例如

self.backgroundColor = UIColor(red:67,green:204,blue:144,alpha:1)

应该是

self.backgroundColor = UIColor(red: 67.0/255, green: 204.0/255, blue:144.0/255, alpha:1)

(同样适用于应用标题颜色)

旁注:Swift 中的 switch 默认情况下不会失效,因此您可以省略 break。如果您明确需要此行为,则有一个 fallthrough 关键字。

您可能会使用 UIControlEvents 获得您所看到的内容。

self.addTarget(target, action: action, for: .touchUpInside)

这是一个简单的例子。当然,您不需要 awakeFromNib 和所有其他代码之类的东西 - 让 OS 工作。

这是您可以针对 **addTarget(for:) 编写的其他内容:

public static var touchDown: UIControlEvents { get } // on all touch downs
public static var touchDownRepeat: UIControlEvents { get } // on multiple touchdowns (tap count > 1)
public static var touchDragInside: UIControlEvents { get }
public static var touchDragOutside: UIControlEvents { get }
public static var touchDragEnter: UIControlEvents { get }
public static var touchDragExit: UIControlEvents { get }
public static var touchUpInside: UIControlEvents { get }
public static var touchUpOutside: UIControlEvents { get }
public static var touchCancel: UIControlEvents { get }

我的底线?让 OS 为您代劳!

如果您只想更改按钮的突出显示,那么另一种方法是将所有按钮连接到一个插座集合 @IBOutlet var buttons: [UIButton]! 在你的 view/controller 中。 然后,在 didTapButton(_ sender: UIButton) 中,您根据点击的按钮更新按钮的选定 属性(类似这样):

@IBAction func didTapBUtton(_ sender: UIButton) {
    // Select the button that was tapped, unselect the other buttons
    buttons.forEach { [=10=].isSelected = ([=10=] == sender) }
}

这使代码在小规模上保持简单,但对于许多按钮来说效率低下,因为循环遍历每个按钮只是为了取消突出显示其中一个按钮有点浪费。如果管理许多按钮,另一种方法是在控制器中使用可选的 selectedButton 属性:

var selectedButton: UIButton?

@IBAction func didTapBUtton(_ sender: UIButton) {
    selectedButton?.isSelected = false
    sender.isSelected = true
    selectedButton = sender
}

你可以利用Swift中的didSet机制:

var selectedButton: UIButton? {
    didSet {
        oldValue?.isSelected = false
        selectedButton.isSelected = true
    }
}

/.../

@IBAction func didTapBUtton(_ sender: UIButton) {
    selectedButton = sender
}