2014-10-28 2 views
34

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

+0

Проверить этот пост https://somethingaboutios.wordpress.com/2016/02/09/uibutton-backgroundcolor-for-uicontrolstatesВыбранный/пример Swift в конце сообщения. –

ответ

84

Если кто-то останавливается, другой путь, может быть более легко, если это то, что вам нужно больше, чем когда-то ... Я написал короткое расширение для UIButton, он прекрасно работает :

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

Вы используете его как setBackgroundImage:

yourButton.setBackgroundColor(UIColor.whiteColor(), forState: UIControlState.Highlighted) 
+5

Это разрушит автоматическую компоновку и удалит угловой радиус. –

+0

@ stephan1001 как он это сделает? Изображение только 1x1, поэтому оно растянуто, чтобы соответствовать кнопке? – ErikPerik

+1

@ user4788711 так же, как установка фонового изображения. Не больше, не меньше. – winterized

14

Ниже приводится один из вариантов. Два 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

+0

Это будет работать отлично! Благодаря! –

+1

Это решение работает только в ViewController, но не в TableViewController.Прикосновение вниз действие также работает в TVC, но только с некоторой задержкой в ​​миллисекундах, так как быстрое касание на экране не изменяет цвет кнопки. Я думаю, что есть какая-то проблема с ячейкой, в которой находится кнопка, но я не уверен. –

+0

Я столкнулся точно в той же проблеме. Если я использую только просмотр, но ничего не происходит, потому что цвет уже вернулся к старому цвету. Я мог бы исправить эту проблему с небольшой задержкой, чтобы цвет переключился на несколько миллисекунд позже. Таким образом, цвет отображается, даже если пользователь только кратковременно отбирает. –

1

Можем ли мы сделать то же самое с использованием атрибутов времени выполнения?

@IBInspectable var HighlightedBackground: Bool { 
      get { 
       return true 
      } 
      set { 
      layer.backgroundColor = Common.sharedInstance.OrangeColor.CGColor 
       print("highlighted state") 
      } 
     } 
22

Синтаксис изменения в @winterized extension синтаксиса 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) 
    }} 
1

Swift 4 Версия this solution:

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

Просто небольшое улучшение кода , чтобы избежать сила-разворачивает попытаться сделать это: ', если позволить currentGraphicsContext = UIGraphicsGetCurrentContext() { currentGraphicsContext.setFillColor (color.cgColor) currentGraphicsContext.fill (CGRect (х: 0, Y: 0, ширина: 1, высота : 1)) } ' Плюс добавление' layer.masksToBounds = true' для сохранения функциональности 'layer.cornerRadius' –

1

Кажется здесь никто не упоминал об использовании ключа наблюдения Значение еще, но это anoth подход.

Причина для этого вместо того, чтобы выбирать другие ответы здесь, вам не нужно постоянно создавать новые изображения и не заниматься вторичными эффектами назначения изображений кнопкам (например, эффекты 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's 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 
Смежные вопросы