web-dev-qa-db-ja.com

StateのUIButton背景色を設定する方法:UIControlState.Highlighted in Swift

ボタンの背景色を設定できますが、UIControlState.Highlightedの背景色を設定する方法がわかりません。それも可能ですか?またはsetBackgroundImageパスを下る必要がありますか?

40
David Wood

誰かが立ち寄った場合、それがあなたが複数回必要なものであるなら、おそらくもっと簡単に行くための別の方法...

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

for 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)
113
winterized

構文の変更 @ winterized extension forSwift 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)
    }}
32
Maverick

以下は、1つの方法です。 2つのIBActions。 1つはボタンを押したときに背景色を制御し、もう1つはリリース時に制御します。

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

16
Steve Rosenberg

Swift 4バージョンの このソリューション

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
kaktusgruen

受け入れられた答えに対する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と互換性があり、壊れた自動レイアウト/コーナー半径のバグを修正します。

4
Maximelc

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

イベントボタンアクション

ハイライト時にタッチを表示

4
Puji Wahono

ここでは誰も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'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
3
Mete

何故なの?

@implementation UIButton (Color)

- (void) setBackgroundColor:(UIColor*)color forState:(UIControlState)state
{
    [self setBackgroundImage:[UIImage.alloc initWithCIImage:[CIImage imageWithColor:[CIColor colorWithCGColor:color.CGColor]]] forState:state];
}

@end
2
poGUIst

ランタイム属性を使用しても同じことができますか?

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