Swift4中如何获取UIButton的默认与选中态文本颜色
这个问题我之前也碰到过,硬编码色值确实太麻烦了——每次在Storyboard里修改按钮颜色后,还要同步更新代码里的色值变量,完全是重复劳动。其实咱们可以直接从UIButton的对应状态中动态提取颜色,这样就能和Storyboard的设置自动同步,再也不用手动维护色值了。
核心思路
UIButton本身就提供了titleColor(for:)方法,可以直接获取对应状态下的文本颜色。我们只需要在视图加载完成后,调用这个方法提取默认态(.normal)和选中态(.selected)的颜色,存入变量即可。
代码实现(Swift)
基础用法
假设你已经通过Storyboard给按钮添加了IBOutlet:
import UIKit class YourViewController: UIViewController { // 关联Storyboard中的按钮 @IBOutlet weak var targetButton: UIButton! // 存储颜色的变量 private var defaultTitleColor: UIColor? private var selectedTitleColor: UIColor? override func viewDidLoad() { super.viewDidLoad() // 从按钮状态中提取颜色 defaultTitleColor = targetButton.titleColor(for: .normal) selectedTitleColor = targetButton.titleColor(for: .selected) // 后续就可以直接使用这两个变量了 if let defaultColor = defaultTitleColor { print("默认态文本颜色:\(defaultColor)") } if let selectedColor = selectedTitleColor { print("选中态文本颜色:\(selectedColor)") } } }
封装扩展(复用场景)
如果你的项目中有多个按钮需要提取状态颜色,可以封装一个UIButton的扩展,让代码更整洁:
extension UIButton { // 获取默认态文本颜色 var normalTitleColor: UIColor? { return titleColor(for: .normal) } // 获取选中态文本颜色 var selectedTitleColor: UIColor? { return titleColor(for: .selected) } }
然后在ViewController中就能更简洁地调用:
override func viewDidLoad() { super.viewDidLoad() defaultTitleColor = targetButton.normalTitleColor selectedTitleColor = targetButton.selectedTitleColor }
注意事项
- 一定要在视图加载完成后提取颜色(比如
viewDidLoad方法中),因为此时按钮已经从Storyboard完成初始化,状态颜色已经被正确设置。如果在init方法中提取,可能会拿到nil。 - 如果按钮的状态颜色是通过
UIAppearance全局设置的,这个方法同样适用,会正确获取到最终的颜色值。
这样一来,以后你在Storyboard中修改按钮的默认/选中态文本颜色时,代码中的变量会自动同步最新值,完全不用手动修改色值啦!
内容的提问来源于stack exchange,提问作者Bijender Singh Shekhawat
相关产品推荐
相关产品推荐

