На це питання є багато відповідей, але всі вони виглядають не дуже корисними, якщо ви дійсно хочете використовувати backgroundColor для стилювання ваших кнопок. UIButton має хороший варіант встановлення різних зображень для різних станів управління, але немає однакової функції для кольорів фону. Отже, одним із рішень є додавання розширення, яке буде генерувати зображення з кольорів та застосовувати їх до кнопки.
extension UIButton {
private func image(withColor color: UIColor) -> UIImage? {
let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
UIGraphicsBeginImageContext(rect.size)
let context = UIGraphicsGetCurrentContext()
context?.setFillColor(color.cgColor)
context?.fill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
self.setBackgroundImage(image(withColor: color), for: state)
}
}
Лише одна проблема з цим рішенням - ця зміна не застосовуватиметься до кнопок, створених у раскадровці. Щодо мене це не проблема, тому що я віддаю перевагу стилю інтерфейсу з коду. Якщо ви хочете використовувати розповіді, то вам потрібна додаткова магія @IBInspectable
.
Другий варіант - це підкласи, але я вважаю за краще уникати цього.