Как установить цвет фона UIButton дляState: UIControlState.Highlighted in Swift

Я могу установить цвет фона для кнопки, но я не могу решить, как установить цвет фона для UIControlState.Highlighted. Возможно ли это? или мне нужно спуститься по пути setBackgroundImage?

Ответ 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.

enter image description here

enter image description here

Ответ 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