Я могу установить цвет фона для кнопки, но я не могу решить, как установить цвет фона для UIControlState.Highlighted
. Возможно ли это? или мне нужно спуститься по пути setBackgroundImage
?
Как установить цвет фона UIButton дляState: UIControlState.Highlighted in Swift
Ответ 1
Если кто-то зайдет, другой способ пойти, может быть, проще, если это то, что вам нужно более одного раза... Я написал небольшое расширение для UIButton, оно работает просто отлично:
для Swift 3
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor)
CGContextFillRect(UIGraphicsGetCurrentContext(), CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, forState: forState)
}
}
для Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControl.State) {
self.clipsToBounds = true // add this to maintain corner radius
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
}
}
Вы используете это так же, как setBackgroundImage
:
yourButton.setBackgroundColor(color: UIColor.white, forState: UIControl.State.highlighted)
Ответ 2
Изменения синтаксиса в расширении @winterized для синтаксиса Swift 3+
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}}
Ответ 3
Ниже будет один путь. Два IBActions. Один для управления цветом фона при нажатии кнопки, один при отпускании.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
@IBAction func buttonClicked(sender: AnyObject) { //Touch Up Inside action
button.backgroundColor = UIColor.whiteColor()
}
@IBAction func buttonReleased(sender: AnyObject) { //Touch Down action
button.backgroundColor = UIColor.blueColor()
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
Когда вы просматриваете параметры автозаполнения для своей кнопки после добавления периода, вы можете установить цвет фона, но не для указанного состояния. Вы можете устанавливать только фоновые изображения. Теперь, конечно, если вы состоите в браке, чтобы сделать это так, вместо использования метода, который я показываю выше, вы можете загрузить изображение желаемого цвета в качестве фонового изображения с использованием свойства setbackgroundImageForState.
Ответ 4
Swift 4 Version это решение:
extension UIButton {
func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
setBackgroundImage(colorImage, for: state)
}
}
Ответ 5
Обновление Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
Событие Кнопка Действие
Показать Touch On Hightlight
Ответ 6
Совместимость Swift 4+ для принятого ответа:
extension UIButton {
/// Sets the background color to use for the specified button state.
func setBackgroundColor(color: UIColor, forState: UIControlState) {
let minimumSize: CGSize = CGSize(width: 1.0, height: 1.0)
UIGraphicsBeginImageContext(minimumSize)
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(origin: .zero, size: minimumSize))
}
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.clipsToBounds = true
self.setBackgroundImage(colorImage, for: forState)
}
}
Совместим SwiftLint и исправим ошибку разбитого авторазметки/радиуса угла.
Ответ 7
Кажется, что никто здесь не упомянул об использовании Key Value Observation, но это другой подход.
Причина, по которой вместо того, чтобы выбирать другие ответы здесь, заключается в том, что вам не нужно постоянно создавать новые изображения и не беспокоиться о вторичных эффектах назначения изображений кнопкам (например, эффектах cornerRadius).
Но вам нужно создать класс для наблюдателя, который будет отвечать за хранение различных цветов фона и их применение в observeValue()
.
public class ButtonHighlighterObserver: NSObject {
var observedButton:UIButton? = nil
var backgroundColor: UIColor = UIColor.white
var backgroundHighlightColor: UIColor = UIColor.gray
public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
// Perform background color changes when highlight state change is observed
if keyPath == "highlighted", object as? UIButton === observedButton {
observedButton!.backgroundColor = observedButton!.isHighlighted ? self.backgroundHighlightColor : self.backgroundColor
}
}
}
Тогда все, что вам нужно сделать, это управлять addObserver/removeObserver во время работы:
// Add observer to button highlighted value
button.addObserver(anObserver, forKeyPath: "highlighted", options: [.new], context: nil)
anObserver.observedButton = button
// ...
// And at deinit time, be sure you remove the observer again
anObserver.observedButton?.removeObserver(item, forKeyPath: "highlighted")
anObserver.observedButton = nil
Ответ 8
Можем ли мы сделать то же самое с использованием атрибутов времени выполнения?
@IBInspectable var HighlightedBackground: Bool {
get {
return true
}
set {
layer.backgroundColor = Common.sharedInstance.OrangeColor.CGColor
print("highlighted state")
}
}
Ответ 9
Почему бы и нет?
@implementation UIButton (Color)
- (void) setBackgroundColor:(UIColor*)color forState:(UIControlState)state
{
[self setBackgroundImage:[UIImage.alloc initWithCIImage:[CIImage imageWithColor:[CIColor colorWithCGColor:color.CGColor]]] forState:state];
}
@end