ハイライトされているときにUIButtonの背景色を変更するにはどうすればよいですか?


236

アプリのある時点で強調表示されていますUIButton(たとえば、ユーザーがボタンに指を置いている場合など)。ボタンが強調表示されている間(ユーザーの指がボタン上にある間)に背景色を変更する必要があります。 。

私は以下を試しました:

_button.backgroundColor = [UIColor redColor];

しかし、それは機能していません。色は変わりません。ボタンが強調表示されていないときに同じコードを試しましたが、正常に動作します。また-setNeedsDisplay、色を変えて呼び出してみましたが効果がありませんでした。

ボタンに背景色を強制的に変更させる方法は?


回答:


411

UIButtonsetHighlightedメソッドをオーバーライドできます。

Objective-C

- (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];

    if (highlighted) {
        self.backgroundColor = UIColorFromRGB(0x387038);
    } else {
        self.backgroundColor = UIColorFromRGB(0x5bb75b);
    }
}

Swift 3.0およびSwift 4.1

override open var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? UIColor.black : UIColor.white
    }
}

うん。これは、一種の良い方法です。同じようなボタンをいくつか定義できるからです。
Paul Brewczynski 2014年

3
初心者向けの質問ですが、そのボタンメソッドをどこにサブクラス化しますか?ConversionViewControllerという名前のビューコントローラにボタンがある場合、ハイライトまたはタップしたときに背景色を変更するようにボタンを設定するにはどうすればよいですか?COnversionViewControllerでsetHIghlightedをサブクラス化しますか?
Beanno1116 2015

だから私が見つけたこの答えには1つの問題があります。theButtonを選択したときに同じ色を使用できるようにしたい場合は、setSelectedの後にsetHighlightedが呼び出され、選択したスタイルがオーバーライドされます。上記の解決策は、ボタンも選択する場合に適しています
HaloZero

3
@YakivKovalskiyサブクラスを使用していると仮定して、2つのUIColorプロパティ(例:normalBackgroundとhighlightedBackground)を追加し、それに応じてself.backgroundColor = normalBackgroundまたはhighlightedBackgroundを割り当てることができます。使いやすさのためにinitメソッドを追加することを忘れないでください

2
素敵な解決策、ただ1つの提案:backgroundColor = isHighlighted ? .lightGray : .white
Fantini

298

この種類があなたの目的を解決するのか、またはあなたの一般的な開発ランドスケープに適合するのかはわかりませんが、私が最初に試みることは、touchDownイベントのボタンの背景色を変更することです。

オプション1:

キャプチャするには2つのイベントが必要です。UIControlEventTouchDownは、ユーザーがボタンを押したときのものです。UIControlEventTouchUpInsideおよびUIControlEventTouchUpOutsideは、ボタンを離して通常の状態に戻すときに使用されます。

UIButton *myButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setFrame:CGRectMake(10.0f, 10.0f, 100.0f, 20.f)];
[myButton setBackgroundColor:[UIColor blueColor]];
[myButton setTitle:@"click me:" forState:UIControlStateNormal];
[myButton setTitle:@"changed" forState:UIControlStateHighlighted];
[myButton addTarget:self action:@selector(buttonHighlight:) forControlEvents:UIControlEventTouchDown];
[myButton addTarget:self action:@selector(buttonNormal:) forControlEvents:UIControlEventTouchUpInside];

オプション2:

必要なハイライトカラーから作られた画像を返します。これもカテゴリになる可能性があります。

+ (UIImage *)imageWithColor:(UIColor *)color {
   CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
   UIGraphicsBeginImageContext(rect.size);
   CGContextRef context = UIGraphicsGetCurrentContext();

   CGContextSetFillColorWithColor(context, [color CGColor]);
   CGContextFillRect(context, rect);

   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return image;
}

次に、ボタンのハイライト状態を変更します。

[myButton setBackgroundImage:[self imageWithColor:[UIColor greenColor]] forState:UIControlStateHighlighted];

3
UIControlEventTouchUpOutsideとUIControlEventTouchCancelをbuttonHighlight:イベントリストに追加すると、常に機能します。
Evgen Bodunov 2014年

オプション2は、これまでに見つけた中で最高のものです。ただし、この場合、ストーリーボードには利点があると思います。
ジャックソロモン

トーマスの回答の方がいいです。それも私が使用しているものです
Van Du Tran

26
layer.cornerRadiusオプション#2 を使用している場合はclipsToBounds、画像の角を丸めるためにtrueに設定する必要があります。
Sky

3
誰かがで停止し、スウィフトで答えを必要とする場合:stackoverflow.com/questions/26600980/...
防寒

94

highlighted計算されたプロパティとしてオーバーライドする必要はありません。プロパティオブザーバーを使用して、背景色の変更をトリガーできます。

override var highlighted: Bool {
    didSet {
        backgroundColor = highlighted ? UIColor.lightGrayColor() : UIColor.whiteColor()
    }
}

スウィフト4

override open var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? UIColor.lightGray : UIColor.white
    }
}

1
このような機能を使用したことがありません。これがどこに行くのか説明できますか?それはIBAction buttonPress関数内ですか、それともviewDidLoad内ですか?
Dave G

色が異なる複数のUIButtonがある場合はどうなりますか?
Slavcho

6
@Dave G、クリックFile>New>File>Cocoa Touch Classしてに設定することにより、UIButtonの新しいサブクラスを作成しますsubclass of UIButton。ex CustomButtonのファイルに名前を付けます。これは、ファイル名とクラス名の両方になります。このファイル内に、override var highlighted上記のコードを挿入します。最後のステップとして、CustomButton「カスタムクラス」と表示され、ドロップダウンボックスがあるプロパティページに移動して、このサブクラスを使用するようにインターフェイスビルダーのUIButtonを設定します。灰色の文字で「UIButton」と表示されます。ドロップダウンリストにCustomButtonが表示されます。これを選択すると、ボタンがサブクラス化されます。
James Toomey

ボタンをタップしたときにだけセッターが呼び出され、初期レイアウトでは呼び出されないと誰も言及しなかったのはなぜですか。したがって、デフォルトでは、ボタンに触れるまで色はありません。
Dmitrii

したがって、それを機能させるにisHighlighted = falseは、最初のどこかで明示的に呼び出す必要があります(たとえば、初期化時)。
Dmitrii

50

Swiftの便利な汎用拡張機能:

extension UIButton {
    private func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }

    func setBackgroundColor(color: UIColor, forUIControlState state: UIControlState) {
        self.setBackgroundImage(imageWithColor(color), forState: state)
    }
}

Swift 3.0

extension UIButton {
    private func imageWithColor(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(imageWithColor(color: color), for: state)
    }
}

45

Swiftでは、setHighlightedメソッドをオーバーライドする代わりに、強調表示された(または選択された)プロパティのアクセサーをオーバーライドできます

override var highlighted: Bool {
        get {
            return super.highlighted
        }
        set {
            if newValue {
                backgroundColor = UIColor.blackColor()
            }
            else {
                backgroundColor = UIColor.whiteColor()
            }
            super.highlighted = newValue
        }
    }

これは完全に機能しますが、どのようにしてこれを理解できたか混乱していますか?パラメータは、私が知る限り、ドキュメントまたはUIButton.hにはありません。
清水2014年

1
これは、目的cでsetHightlightedをオーバーライドする動作をエミュレートする迅速な構文です。ここでの計算結果のプロパティに関するドキュメントを参照してくださいdeveloper.apple.com/library/ios/documentation/Swift/Conceptual/...
ジェイク・ホール

11
迅速に、didSetを使用できます
Dam

1
プロパティオブザーバーの例を追加しました:stackoverflow.com/a/29186375/195173
Aleksejs Mjaliks 2015年

@shimizuが求めていたのhighlightedは、UIButtonのプロパティをどのようにして知ったのでしょうか。答えは、UIButtonが継承するUIControlのプロパティであるということです。
Adam Johns

25

ハイライトされた変数を上書きします。追加@IBInspectableすると、ストーリーボードで強調表示されたbackgroundColorを編集できます。

class BackgroundHighlightedButton: UIButton {
    @IBInspectable var highlightedBackgroundColor :UIColor?
    @IBInspectable var nonHighlightedBackgroundColor :UIColor?
    override var highlighted :Bool {
        get {
            return super.highlighted
        }
        set {
            if newValue {
                self.backgroundColor = highlightedBackgroundColor
            }
            else {
                self.backgroundColor = nonHighlightedBackgroundColor
            }
            super.highlighted = newValue
        }
    }
}

20

よりコンパクトなソリューション(@ aleksejs-mjaliksの回答に基づく):

Swift 3/4 +

override var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? .lightGray : .white
    }
}

スウィフト2:

override var highlighted: Bool {
    didSet {
        backgroundColor = highlighted ? UIColor.lightGrayColor() : UIColor.whiteColor()
    }
}

オーバーライドしたくない場合、これは@ timur-bernikowichの回答の更新バージョンです(Swift 4.2)。

extension UIButton {
  func setBackgroundColor(_ color: UIColor, forState controlState: UIControl.State) {
    let colorImage = UIGraphicsImageRenderer(size: CGSize(width: 1, height: 1)).image { _ in
      color.setFill()
      UIBezierPath(rect: CGRect(x: 0, y: 0, width: 1, height: 1)).fill()
    }
    setBackgroundImage(colorImage, for: controlState)
  }
}

@FedericoZanetelloこれはアプリのすべてのボタンのisHighlightedをオーバーライドしますが、これは私の意見では良い解決策ではありません。ティムールの答えに合わない。
ウサマビンアティック2017年

13

Swift 3+構文のUIButton拡張機能:

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

次のように使用します。

YourButton.setBackgroundColor(color: UIColor.white, forState: .highlighted)

元の回答:https : //stackoverflow.com/a/30604658/3659227


10

Swiftでのアプローチは次のとおりです。UIButton拡張機能を使用して、highlightedBackgroundColorというIBInspectableを追加します。サブクラスを必要とせず、サブクラス化に似ています。

private var HighlightedBackgroundColorKey = 0
private var NormalBackgroundColorKey = 0

extension UIButton {

    @IBInspectable var highlightedBackgroundColor: UIColor? {
        get {
            return objc_getAssociatedObject(self, &HighlightedBackgroundColorKey) as? UIColor
        }

        set(newValue) {
            objc_setAssociatedObject(self,
                &HighlightedBackgroundColorKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN))
        }
    }

    private var normalBackgroundColor: UIColor? {
        get {
            return objc_getAssociatedObject(self, &NormalBackgroundColorKey) as? UIColor
        }

        set(newValue) {
            objc_setAssociatedObject(self,
                &NormalBackgroundColorKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN))
        }
    }

    override public var backgroundColor: UIColor? {
        didSet {
            if !highlighted {
                normalBackgroundColor = backgroundColor
            }
        }
    }

    override public var highlighted: Bool {
        didSet {
            if let highlightedBackgroundColor = self.highlightedBackgroundColor {
                if highlighted {
                    backgroundColor = highlightedBackgroundColor
                } else {
                    backgroundColor = normalBackgroundColor
                }
            }
        }
    }
}

これがお役に立てば幸いです。


1
Swift 2.0の場合、列挙型を使用するようにobjc_setAssociatedObjectの呼び出しを更新する必要があります:objc_setAssociatedObject(self、&NormalBackgroundColorKey、newValue、.OBJC_ASSOCIATION_RETAIN)
Eli Burke

すべてをストーリーボードに残したい場合は、Swiftで間違いなく最善の方法です。
davidethell 2016年

1
私は、これは全体のアプリに影響を与えるよう拡張サブクラスを使用していない好む
ホッサムGhareeb


9

サブクラス化なしのSwift 3+に対する私の最善のソリューション。

extension UIButton {
  func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
    let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
    UIGraphicsBeginImageContext(rect.size)
    color.setFill()
    UIRectFill(rect)
    let colorImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    setBackgroundImage(colorImage, for: state)
  }
}

この拡張機能を使用すると、さまざまな状態の色を簡単に管理でき、ハイライトされた色が提供されない場合は、通常の色が自動的にフェードアウトします。

button.setBackgroundColor(.red, for: .normal)

4

更新:

UIButtonBackgroundColor Swiftライブラリを使用します

古い:

以下のヘルパーを使用して、グレースケールの塗りつぶし色で1 px x 1 pxの画像を作成します。

UIImage *image = ACUTilingImageGray(248/255.0, 1);

またはRGB塗りつぶし色:

UIImage *image = ACUTilingImageRGB(253/255.0, 123/255.0, 43/255.0, 1);

次に、それを使用しimageてボタンの背景画像を設定します。

[button setBackgroundImage:image forState:UIControlStateNormal];

ヘルパー

#pragma mark - Helpers

UIImage *ACUTilingImageGray(CGFloat gray, CGFloat alpha)
{
    return ACUTilingImage(alpha, ^(CGContextRef context) {
        CGContextSetGrayFillColor(context, gray, alpha);
    });
}

UIImage *ACUTilingImageRGB(CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)
{
    return ACUTilingImage(alpha, ^(CGContextRef context) {
        CGContextSetRGBFillColor(context, red, green, blue, alpha);
    });
}

UIImage *ACUTilingImage(CGFloat alpha, void (^setFillColor)(CGContextRef context))
{
    CGRect rect = CGRectMake(0, 0, 0.5, 0.5);
    UIGraphicsBeginImageContextWithOptions(rect.size, alpha == 1, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    setFillColor(context);
    CGContextFillRect(context, rect);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

注:ACUはAcani Utilitiesと呼ばれる私のCocoa Touch静的ライブラリのクラスプレフィックスです。ACはAcani、UはUtilitiesです。


4

これを試して !!!!

TouchedDownイベントの場合は1つの色を設定し、TouchUpInsideの場合はもう1つの色を設定します。

- (IBAction)touchedDown:(id)sender {
    NSLog(@"Touched Down");
    btn1.backgroundColor=[UIColor redColor];
}

- (IBAction)touchUpInside:(id)sender {
    NSLog(@"TouchUpInside");
    btn1.backgroundColor=[UIColor whiteColor];    
}

2
私のために働いた。- (IBAction)onButtonTouchDragOutside:(UIButton *)sender {ユーザーが誤って指をボタンからドラッグしたときに色が残っていないことを確認するために追加する必要がありました。
SudoPlz 2016

4

UIButtonをサブクラス化し、便利な使用のために検査可能なプロパティを追加します(Swift 3.0で記述)。

final class SelectableBackgroundButton: UIButton {

    private struct Constants {
        static let animationDuration: NSTimeInterval = 0.1
    }

    @IBInspectable
    var animatedColorChange: Bool = true

    @IBInspectable
    var selectedBgColor: UIColor = UIColor.blackColor().colorWithAlphaComponent(0.2)

    @IBInspectable
    var normalBgColor: UIColor = UIColor.clearColor()

    override var selected: Bool {
        didSet {
            if animatedColorChange {
                UIView.animateWithDuration(Constants.animationDuration) {
                    self.backgroundColor = self.selected ? self.selectedBgColor : self.normalBgColor
                }
            } else {
                self.backgroundColor = selected ? selectedBgColor : normalBgColor
            }
        }
    }

    override var highlighted: Bool {
        didSet {
            if animatedColorChange {
                UIView.animateWithDuration(Constants.animationDuration) {
                    self.backgroundColor = self.highlighted ? self.selectedBgColor : self.normalBgColor
                }
            } else {
                self.backgroundColor = highlighted ? selectedBgColor : normalBgColor
            }
        }
    }
}

3

UIButtonをサブクラス化して、forStateを作成できます。

colourButton.h

#import <UIKit/UIKit.h>

@interface colourButton : UIButton

-(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state;

@end

colourButton.m

#import "colourButton.h"

@implementation colourButton
{
    NSMutableDictionary *colours;
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    // If colours does not exist
    if(!colours)
    {
        colours = [NSMutableDictionary new];  // The dictionary is used to store the colour, the key is a text version of the ENUM
        colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]] = (UIColor*)self.backgroundColor;  // Store the original background colour
    }

    return self;
}

-(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state
{
    // If it is normal then set the standard background here
    if(state & UIControlStateNormal)
    {
        [super setBackgroundColor:backgroundColor];
    }

    // Store the background colour for that state
    colours[[NSString stringWithFormat:@"%lu", state]]= backgroundColor;
}

-(void)setHighlighted:(BOOL)highlighted
{
    // Do original Highlight
    [super setHighlighted:highlighted];

    // Highlight with new colour OR replace with orignial
    if (highlighted && colours[[NSString stringWithFormat:@"%lu", UIControlStateHighlighted]])
    {
        self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateHighlighted]];
    }
    else
    {
        self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]];
    }
}

-(void)setSelected:(BOOL)selected
{
    // Do original Selected
    [super setSelected:selected];

    // Select with new colour OR replace with orignial
    if (selected && colours[[NSString stringWithFormat:@"%lu", UIControlStateSelected]])
    {
        self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateSelected]];
    }
    else
    {
        self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]];
    }
}

@end

ノート(これは例であり、問​​題があることを知っています。ここにいくつかあります)

私はNSMutableDictionayを使用して各状態のUIColorを格納しました。UIControlStateは適切なストレートIntではないため、キーの厄介なテキスト変換を行う必要があります。それだけの数のオブジェクトで配列を初期化し、Stateをインデックスとして使用できる場合。

このため、選択したボタンや無効にしたボタンなど、多くの問題が発生します。さらにロジックが必要です。

もう1つの問題は、同時に複数の色を設定しようとすると、ボタンを試していないが、これを実行できる場合は機能しない可能性がある

 [btn setBackgroundColor:colour forState:UIControlStateSelected & UIControlStateHighlighted];

これはStoryBoardであると想定しています。init、initWithFrameはないので、必要に応じて追加してください。


3
extension UIButton {
    func setBackgroundColor(color: UIColor, forState: UIControl.State) {
        let size = CGSize(width: 1, height: 1)
        UIGraphicsBeginImageContext(size)
        let context = UIGraphicsGetCurrentContext()
        context?.setFillColor(color.cgColor)
        context?.fill(CGRect(origin: CGPoint.zero, size: size))
        let colorImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        setBackgroundImage(colorImage, for: forState)
    }

}

Swift 5、ありがとう@Maverick


3

細部

  • Xcode 11.1(11A1027)、Swift 5

解決

import UIKit

extension UIColor {
    func createOnePixelImage() -> UIImage? {
        let size = CGSize(width: 1, height: 1)
        UIGraphicsBeginImageContext(size)
        defer { UIGraphicsEndImageContext() }
        guard let context = UIGraphicsGetCurrentContext() else { return nil }
        context.setFillColor(cgColor)
        context.fill(CGRect(origin: .zero, size: size))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

extension UIButton {
    func setBackground(_ color: UIColor, for state: UIControl.State) {
        setBackgroundImage(color.createOnePixelImage(), for: state)
    }
}

使用法

button.setBackground(.green, for: .normal)

2

画像がある場合は、これを試してください。

-(void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state;

またはshowsTouchWhenHighlightedあなたにとって十分であるかどうかを確認してください。


showTouchWhenHighlightedをいじってみましたが、役に立ちませんでした。setBackgroundImage:forState:を使用したくありません。実際にはbackgroundColorを使用して画像を使用しないようにしようとしていました。
MartinMoizard 2013年

2

このギャップ機能の穴を埋めるために、UIButtonサブクラスSTAButtonをオープンソース化しました。MITライセンスで利用できます。iOS 7以降で動作します(古いバージョンのiOSではテストしていません)。


2

この問題を解決するために私が処理するためのカテゴリを作成backgroundColorして国をUIButtons
ButtonBackgroundColor-のiOSを

カテゴリをポッドとしてインストールできます

Objective-Cで使いやすい

@property (nonatomic, strong) UIButton *myButton;

...

[self.myButton bbc_backgroundColorNormal:[UIColor redColor]
                 backgroundColorSelected:[UIColor blueColor]];

Swiftでさらに使いやすく:

import ButtonBackgroundColor

...

let myButton:UIButton = UIButton(type:.Custom)

myButton.bbc_backgroundColorNormal(UIColor.redColor(), backgroundColorSelected: UIColor.blueColor())

次の方法でポッドをインポートすることをお勧めします。

platform :ios, '8.0'
use_frameworks!

pod 'ButtonBackgroundColor', '~> 1.0'

use_frameworksの使用!Podfileでは、SwiftとObjective-Cでポッドを使いやすくします。

重要

また、詳細情報をブログに投稿しました。


2
class CustomButton: UIButton {

    override var isHighlighted: Bool {
        didSet {
            if (isHighlighted) {
                alpha = 0.5
            }
            else {
                alpha = 1
            }            
        }
    }

}


1

試してくださいtintColor

_button.tintColor = [UIColor redColor];

IBにリンクされていますか?あなたがした場合、あなたは何を得るのNSLog(@"%@", _button);ですか?
jjv360 2013年

1
を使用している場合、これは機能しませんUIButtonTypeCustom
JaredH 2014年

1

ボタンの状態を選択するSwiftのコードは次のとおりです。

func imageWithColor(color:UIColor) -> UIImage {
    let rect:CGRect = CGRectMake(0.0, 0.0, 1.0, 1.0)
     UIGraphicsBeginImageContext(rect.size)
    let context:CGContextRef = UIGraphicsGetCurrentContext()!
    CGContextSetFillColorWithColor(context, color.CGColor)
    CGContextFillRect(context, rect)
    let image:UIImage = UIGraphicsGetImageFromCurrentImageContext();
    return image;
}

例:

    self.button.setImage(self.imageWithColor(UIColor.blackColor()), forState: .Highlighted)

1

ドロップして、
準備完了です。*プロパティはIBで設定できます。ハイライトされた背景が設定されていない場合、押しても背景は変わりません。

private var highlightedBackgroundColors = [UIButton:UIColor]()
private var unhighlightedBackgroundColors = [UIButton:UIColor]()
extension UIButton {

    @IBInspectable var highlightedBackgroundColor: UIColor? {
        get {
            return highlightedBackgroundColors[self]
        }

        set {
            highlightedBackgroundColors[self] = newValue
        }
    }

    override open var backgroundColor: UIColor? {
        get {
            return super.backgroundColor
        }

        set {
            unhighlightedBackgroundColors[self] = newValue
            super.backgroundColor = newValue
        }
    }

    override open var isHighlighted: Bool {
        get {
            return super.isHighlighted
        }

        set {
            if highlightedBackgroundColor != nil {
                super.backgroundColor = newValue ? highlightedBackgroundColor : unhighlightedBackgroundColors[self]
            }
            super.isHighlighted = newValue
        }
    }
}

1

以下のUIIImage拡張機能は、指定されたカラーパラメータを持つ画像オブジェクトを生成します。

extension UIImage {
    static func imageWithColor(tintColor: UIColor) -> UIImage {
        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
        tintColor.setFill()
        UIRectFill(rect)
        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
       }
    }

ボタンの使用例は、ボタンオブジェクトに次のように適用できます。

setupButton.setBackgroundImage(UIImage.imageWithColor(tintColor: UIColor(displayP3Red: 232/255, green: 130/255, blue: 121/255, alpha: 1.0)), for: UIControlState.highlighted)

setupButton.setBackgroundImage(UIImage.imageWithColor(tintColor: UIColor(displayP3Red: 255/255, green: 194/255, blue: 190/255, alpha: 1.0)), for: UIControlState.normal)

1

単純なのは、そのUIButton拡張機能のみを使用することです。

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

}

そしてこれを使う

 optionButton.setBackgroundColor(color: UIColor(red:0.09, green:0.42, blue:0.82, alpha:1.0), forState: .selected)

 optionButton.setBackgroundColor(color: UIColor(red:0.96, green:0.96, blue:0.96, alpha:1.0), forState: .highlighted)

 optionButton.setBackgroundColor(color: UIColor(red:0.96, green:0.96, blue:0.96, alpha:1.0), forState: .normal)


0

スウィフト3:

extension UIButton {
    private func imageWithColor(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, forUIControlState state: UIControlState) {
        self.setBackgroundImage(imageWithColor(color: color), for: state)
    }
}

0

Swift 5

選択した状態を打つために色付きの背景を使用したくない人のために

#Selector&ifステートメントを使用して各状態のUIButtonの色を個別に簡単に変更することで、問題を簡単に解決できます

例えば:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.myButtonOutlet.backgroundColor = UIColor.white  //to reset the button color to its original color ( optionally )
}

@IBOutlet weak var myButtonOutlet: UIButton!{
    didSet{  // Button selector and image here
        self.myButtonOutlet.setImage(UIImage(systemName: ""), for: UIControl.State.normal)

        self.myButtonOutlet.setImage(UIImage(systemName: "checkmark"), for: UIControl.State.selected)



        self.myButtonOutlet.addTarget(self, action: #selector(tappedButton), for: UIControl.Event.touchUpInside)
    }
}

@objc func tappedButton() {  // Colors selection is here
    if self.myButtonOutlet.isSelected == true {

        self.myButtonOutlet.isSelected = false
        self.myButtonOutlet.backgroundColor = UIColor.white         
    } else {
        self.myButtonOutlet.isSelected = true

        self.myButtonOutlet.backgroundColor = UIColor.black
        self.myButtonOutlet.tintColor00 = UIColor.white

    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.