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

问题描述:

我已经创建了一个名为RegistrationButton的自定义UIButton。我目前正在尝试允许用户在三个按钮之间进行选择。在选择一个按钮时,背景颜色和文字将会改变。 这里是IBAction为的样子:如何更改使用IBAction注册的自定义UIButton的颜色?

@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类如何:

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

}

然而,当我选择上的一个按钮,所有的背景改为白色。 enter image description here

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) 

(当你申请的标题一样的颜色显然也适用)

旁注:斯威夫特一switch不默认情况下,所以你可以省略break。如果你明确需要这种行为,那么有一个fallthrough关键字。

+2

向上投票。即使事情的基本原因是提问者不理解如何使用UIButton,远远不足以满足需求。 – dfd

您可能会看到使用UIControlEvents时看到的内容。

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

这是一个简单的例子。当然,你不需要像awakeFromNib和所有其他代码那样的东西 - 让操作系统工作。

这里的其他东西,你可以编写针对** addTarget(为:):

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 } 

我的底线是什么?让操作系统为您做好工作!

如果所有你想要做正在改变按钮的亮点则另一种方法是将所有的按钮连接到出口集合 @IBOutlet var buttons: [UIButton]!在您的视图/控制器。

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

这样可以使代码的简单小规模,但变得低效的许多按钮,因为它是一个有点: 然后,在didTapButton(_ sender: UIButton)基于哪个按钮被窃听(像这样),你更新按钮选择属性无用地循环每一个按钮只是为了避免其中的一个。如果管理许多按钮,另一种方法是在你的控制器使用一个可选的selectedButton属性:

var selectedButton: UIButton? 

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

您可以利用didSet机制斯威夫特:

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

/.../ 

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