UIButtonsの背景色を変更することは可能ですか?


105

これは私が困惑しています。

Cocoa for iPhoneでUIButtonの背景色を変更することはまったく可能ですか?背景色を設定してみましたが、角だけが変わります。setBackgroundColor:そのようなものに利用できる唯一の方法のようです。

[random setBackgroundColor:[UIColor blueColor]];
[random.titleLabel setBackgroundColor:[UIColor blueColor]];

画像を修正したり、削除したりできますか?kthx;)
stigi

o-0 hmmmm .....、画像は問題ありませんでしたが、表示されなくなりました。削除した
ばかり


私は&過去にこの問題を解決する[1] [1]のリンクに[UIButtonの動的変更の境界線やbackgraound]をチェックしてください投稿:stackoverflow.com/questions/9733213/...
IMMORTAL

良いチュートリアルとサンプルコードはここで見つけるcimgf.com/2010/01/28/...
Shamsudheen TK

回答:


160

これは、レプリカを作成することによってプログラムで実行できます。

loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
[loginButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
loginButton.backgroundColor = [UIColor whiteColor];
loginButton.layer.borderColor = [UIColor blackColor].CGColor;
loginButton.layer.borderWidth = 0.5f;
loginButton.layer.cornerRadius = 10.0f;

編集:もちろん、あなたはする必要があります #import <QuartzCore/QuartzCore.h>

編集:すべての新しい読者には、「別の可能性」として追加されたいくつかのオプションも考慮する必要があります。あなたの考慮のために。

これは古い答えなので、トラブルシューティングのためにコメントを読むことを強くお勧めします


これはOPが探しているものです。
Steven

4
甘い!私が見つけたすべてのソルンのうち、これは私が一緒に行ったものです。明確化のポイントとして、「レプリカ」を作成することは、RoundedRectタイプのボタンを使用するのではなく、Quartzを使用してカスタムボタンに角丸長方形を描画することを意味します。最初は、どういうわけか、bgカラーの変更をシミュレートするために、別の色で丸みを帯びた四角形の複製を作成することを意味していました。
デーバー、2011

1
完全に機能し、OPに対する最良の回答です。共有いただきありがとうございます。
Bram

@daver:この回答は非常に人気が高いので、欠けているメリットがあるに違いありません。状態に応じて背景色をどのように変更できますか?おそらく、状態が変化するたびに背景色を明示的に変更する必要があります。ボタンを押すと、Webサービスが応答するまで無効になります。印刷機の色をハイライトするように変更し、WSの応答を待つ間にタイマーを無効な色に変更する必要がありますか?ポイントが足りない場合は誰か説明してください。ポリー、ありがとう。
ポリー

1
@Polly:申し訳ありませんが、あなたのコメントはすぐには表示されませんでしたが、それでも興味がある場合は、ここで私がやったことをサブクラス化します。描画後、CGGradientCreateWithColorComponents()を使用してグラデーションで塗りつぶします。この関数の引数の1つは、浮動小数点数の4要素配列です(R、G、B、およびアルファに対応)。各状態に1つずつ、2つのカラー配列を定義し、ボタンの状態に基づいて適切なものをdrawRectで選択しました。
デーバー2013

59

私には別のアプローチがあります

[btFind setTitle:NSLocalizedString(@"Find", @"") forState:UIControlStateNormal];    
[btFind setBackgroundImage:[CommonUIUtility imageFromColor:[UIColor cyanColor]] 
        forState:UIControlStateNormal];
btFind.layer.cornerRadius = 8.0;
btFind.layer.masksToBounds = YES;
btFind.layer.borderColor = [UIColor lightGrayColor].CGColor;
btFind.layer.borderWidth = 1;

CommonUIUtilityから、

+ (UIImage *) imageFromColor:(UIColor *)color {
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    //  [[UIColor colorWithRed:222./255 green:227./255 blue: 229./255 alpha:1] CGColor]) ;
    CGContextFillRect(context, rect);
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

することを忘れないでください #import <QuartzCore/QuartzCore.h>


2
良いですね。追加する必要があることがわかりましたbtFind.layer.borderWidth = 1;
DefenestrationDay

私はこのソリューションが好きですが、現時点では使用できません。「CommonUIUtility」が見つからないため、エラーが発生します。グーグルは私に日食のものを与えます、しかし私はそれがQuartzCoreにあるべきだと思いますか?何か案は?
ステファン

いいえ、それはアプリで一般的なUIを行うためのユーザー定義クラスです。独自のクラスでimageFromColorメソッドを記述します。
karim

1
UIButtonのカテゴリメソッドのようなにおいがしますsetBackgroundColor:(UIColor *) forState:(UIControlState)
EthanB 2013

3
iOS 7を使用しているのはばかげているので、背景色を追加する最もクリーンな方法です
dmur

32

私はあなたがUIButtonについて話していると思いますUIButtonTypeRoundedRectか?その背景色は変更できません。背景色を変更しようとすると、ボタンが描画されている四角形の色が変更されます(通常はクリアです)。したがって、2つの方法があります。UIButtonをサブクラス化してその-drawRect:メソッドを上書きするか、さまざまなボタンの状態の画像を作成します(これで問題ありません)。

Interface Builderで背景画像を設定すると、ボタンが持つすべての状態の画像の設定がIBでサポートされないことに気付くはずなので、次のようなコードで画像を設定することをお勧めします。

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setBackgroundImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[myButton setBackgroundImage:[UIImage imageNamed:@"disabled.png"] forState:UIControlStateDisabled];
[myButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected];
[myButton setBackgroundImage:[UIImage imageNamed:@"higligted.png"] forState:UIControlStateHighlighted];
[myButton setBackgroundImage:[UIImage imageNamed:@"highlighted+selected.png"] forState:(UIControlStateHighlighted | UIControlStateSelected)];

最後の行は、選択および強調表示された状態の画像を設定する方法を示しています(これはIBが設定できないものです)。ボタンが選択された状態である必要がない場合は、選択された画像(4行目と6行目)は必要ありません。


説明ありがとうございます。簡単な質問です。drawrectメソッドを上書きする場合、描画ライブラリを使用する必要があると思いますか?プログラムで丸みを帯びた四角形を描画し、それを色で塗りつぶす線だけですか?
ダブビート

2
私はちょうど「ラウンドコーナーのdrawRect iphone」の略Googleのクエリを行なったし、これを見つけた:iphonedevelopment.blogspot.com/2008/11/...が 丸い矩形を描画する方法例えばのdrawRectメソッドを確認してください。とを使用CGContextSetFillColorWithColorCGContextFillPathて、で描かれたパスを塗りつぶすことができますCGContextAddArcToPoint
stigi

2
コントロール状態のビットマスキングの可能性を指摘するための+50、すなわち:forState:(UIControlStateHighlighted | UIControlStateSelected)乾杯。
NSTJ 2014年

28

別の可能性:

  1. Interface BuilderでUIButtonを作成します。
  2. タイプを「カスタム」にします
  3. 今、IBでは背景色を変更することが可能です

しかし、ボタンは正方形であり、それは私たちが望むものではありません。このボタンへの参照を使用してIBOutletを作成し、viewDidLoadメソッドに以下を追加します。

[buttonOutlet.layer setCornerRadius:7.0f];
[buttonOutlet.layer setClipToBounds:YES];

QuartzCore.hをインポートすることを忘れないでください


7
パーフェクト、ありがとう!私が使用しているiOSバージョン(5.1)が原因かどうかはわかりませんが、setClipToBoundsが利用できませんでした。代わりに、buttonOutlet.layer.masksToBounds = TRUE;を使用しました。
iforce2d

このコードを追加すると、丸みを帯びた四角形が表示されますが、クリックしても、ボタンが反転表示されません。何が起こっている?
2013

このアプローチの問題は、ボタンのハイライト状態の背景色を設定できないことです。
ch3rryc0ke 2013年

17

UIButtonをサブクラス化し、setHighlightedメソッドとsetSelectedメソッドをオーバーライドする

-(void) setHighlighted:(BOOL)highlighted {

  if(highlighted) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setHighlighted:highlighted];
}

-(void) setSelected:(BOOL)selected {

  if(selected) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setSelected:selected];
}

私のdarkerShadeメソッドは、このようなUIColorカテゴリにあります

-(UIColor*) darkerShade {

  float red, green, blue, alpha;
  [self getRed:&red green:&green blue:&blue alpha:&alpha];

  double multiplier = 0.8f;
  return [UIColor colorWithRed:red * multiplier green:green * multiplier blue:blue*multiplier alpha:alpha];
}

7

色付きのUIButton

画像を使用したくない場合、Rounded Rectスタイルとまったく同じようにしたい場合は、これを試してください。同一のフレームと自動サイズ変更マスクを使用して、UIViewの上にUIViewを配置し、アルファを0.3に設定し、背景を色に設定するだけです。次に、以下のスニペットを使用して、色付きのオーバーレイビューから丸みを帯びたエッジを切り取ります。また、UIViewのIBで[User Interaction Enabled]チェックボックスをオフにして、タッチイベントをその下のUIButtonにカスケードできるようにします。

1つの副作用は、テキストも色付けされることです。

#import <QuartzCore/QuartzCore.h>

colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;

7

別の可能性(最良で最も美しいimho):

Interface Builderで必要な背景色に2つのセグメントを持つUISegmentedControlを作成します。タイプを「bar」に設定します。次に、セグメントを1つだけに変更します。インターフェイスビルダーは1つのセグメントを受け付けないため、プログラムで行う必要があります。

したがって、このボタンのIBOutletを作成し、これをビューのviewDidLoadに追加します。

[segmentedButton removeSegmentAtIndex:1 animated:NO];

これで、指定した背景色を持つ美しい光沢のある色付きのボタンができました。アクションについては、「値変更」イベントを使用します。

(私はこれをhttp://chris-software.com/index.php/2009/05/13/creating-a-nice-glass-buttons/で見つけました)。クリス、ありがとう!


5

ええと、UIButtonの背景色だけを変更することはできないというのが99%肯定です。代わりに、背景画像を自分で変更する必要があります。私はこれをしなければならなかったことに驚いています。

私が間違っている、または背景画像を設定する必要がないより良い方法がある場合は、私に知らせてください

[random setBackgroundImage:[UIImage imageNamed:@"toggleoff.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor darkTextColor] forState:UIControlStateNormal];


[random setBackgroundImage:[UIImage imageNamed:@"toggleon.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

5
あなたは絶対的に正しいです。それは苦痛であり、画像を作成する手間ではなく、実行に数分かかるはずのものです。加えて、ボタンが丸い場合、それを行うのもさらに難しくなります...そのような苦痛。
Henley Chiu 2011

2

@EthanBの提案と、バックフィルされた長方形を作成する@karimに従って、UIButtonのカテゴリを作成してこれを実現しました。

カテゴリーコードをドロップするだけです:https : //github.com/zmonteca/UIButton-PLColor

使用法:

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

使用するオプションのforStates:

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected

2

ボタンにCALayerを追加することもできます。これには、カラーオーバーレイなど、さまざまなことができます。この例では、無地のカラーレイヤーを使用して、簡単に色を調整できます。追加されたレイヤーは下にあるものを覆い隠しますが

+(void)makeButtonColored:(UIButton*)button color1:(UIColor*) color
{

    CALayer *layer = button.layer;
    layer.cornerRadius = 8.0f;
    layer.masksToBounds = YES;
    layer.borderWidth = 4.0f;
    layer.opacity = .3;//
    layer.borderColor = [UIColor colorWithWhite:0.4f alpha:0.2f].CGColor;

    CAGradientLayer *colorLayer = [CAGradientLayer layer];
    colorLayer.cornerRadius = 8.0f;
    colorLayer.frame = button.layer.bounds;
    //set gradient colors
    colorLayer.colors = [NSArray arrayWithObjects:
                         (id) color.CGColor,
                         (id) color.CGColor,
                         nil];

    //set gradient locations
    colorLayer.locations = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0f],
                            [NSNumber numberWithFloat:1.0f],
                            nil];


    [button.layer addSublayer:colorLayer];

}

鮮やかさ!!!!!!しかし、同じボタンに対して何度も呼び出すことができませんでした。できますが、新しいレイヤーが何度も追加されます。
Valeriy Van 2013

@StanJames:コードの編集はコメント(または適切な場合は独自の回答)で提案する必要があります。
mafso 2014年

1

以下のための第二のターゲットを追加するUIButtonためUIControlEventTouchedと変更UIButton背景色を。次に、それをUIControlEventTouchUpInsideターゲットに戻します。



1

これはUIButtonをサブクラス化するほどエレガントではありませんが、簡単なものだけが必要な場合は、カスタムボタンを作成し、ボタンの色と1px x 1pxの画像を作成し、背景を設定しました。強調表示された状態のその画像へのボタンの-私のニーズに合います。


1

私はこれがずっと前に尋ねられたことを知っています、そして今、新しいUIButtonTypeSystemがあります。しかし、新しい質問はこの質問の重複としてマークされているので、iOS 7のシステムボタンのコンテキストでの私の新しい回答を次に示し.tintColorます。このプロパティを使用します。

let button = UIButton(type: .System)
button.setTitle("My Button", forState: .Normal)
button.tintColor = .redColor()

0

[myButton setBackgroundColor:[UIColor blueColor]]; [myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

このように変更したり、ストーリーボードで変更したり、右側のオプションの背景を変更したりすることができます。


0

スウィフト3:

        static func imageFromColor(color: UIColor, width: CGFloat, height: CGFloat) -> UIImage {
            let rect = CGRect(x: 0, y: 0, width: width, height: height)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()!
            context.setFillColor(color.cgColor)
            context.fill(rect)
            let img = UIGraphicsGetImageFromCurrentImageContext()!
            UIGraphicsEndImageContext()
            return img
        }

        let button = UIButton(type: .system)
        let image = imageFromColor(color: .red, width: 
        button.frame.size.width, height: button.frame.size.height)
        button.setBackgroundImage(image, for: .normal)

そこに置いたコードを呼び出す方法または使用する方法を述べた場合、これははるかに有用な答えになります。UIButton拡張機能に入りますか?
Michael Dautermann 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.