これは私が困惑しています。
Cocoa for iPhoneでUIButtonの背景色を変更することはまったく可能ですか?背景色を設定してみましたが、角だけが変わります。setBackgroundColor:
そのようなものに利用できる唯一の方法のようです。
[random setBackgroundColor:[UIColor blueColor]];
[random.titleLabel setBackgroundColor:[UIColor blueColor]];
これは私が困惑しています。
Cocoa for iPhoneでUIButtonの背景色を変更することはまったく可能ですか?背景色を設定してみましたが、角だけが変わります。setBackgroundColor:
そのようなものに利用できる唯一の方法のようです。
[random setBackgroundColor:[UIColor blueColor]];
[random.titleLabel setBackgroundColor:[UIColor blueColor]];
回答:
これは、レプリカを作成することによってプログラムで実行できます。
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>
編集:すべての新しい読者には、「別の可能性」として追加されたいくつかのオプションも考慮する必要があります。あなたの考慮のために。
これは古い答えなので、トラブルシューティングのためにコメントを読むことを強くお勧めします
私には別のアプローチがあります
[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>
btFind.layer.borderWidth = 1;
setBackgroundColor:(UIColor *) forState:(UIControlState)
。
私はあなたが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行目)は必要ありません。
CGContextSetFillColorWithColor
しCGContextFillPath
て、で描かれたパスを塗りつぶすことができますCGContextAddArcToPoint
。
forState:(UIControlStateHighlighted | UIControlStateSelected)
乾杯。
別の可能性:
しかし、ボタンは正方形であり、それは私たちが望むものではありません。このボタンへの参照を使用してIBOutletを作成し、viewDidLoadメソッドに以下を追加します。
[buttonOutlet.layer setCornerRadius:7.0f];
[buttonOutlet.layer setClipToBounds:YES];
QuartzCore.hをインポートすることを忘れないでください
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];
}
画像を使用したくない場合、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;
別の可能性(最良で最も美しい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/で見つけました)。クリス、ありがとう!
ええと、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];
@EthanBの提案と、バックフィルされた長方形を作成する@karimに従って、UIButtonのカテゴリを作成してこれを実現しました。
カテゴリーコードをドロップするだけです:https : //github.com/zmonteca/UIButton-PLColor
使用法:
[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];
使用するオプションのforStates:
UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected
ボタンに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];
}
プロフェッショナルで見栄えの良いボタンについては、このカスタムボタンコンポーネントをチェックしてください。ビューやテーブルビューで直接使用するか、ソースコードを変更してニーズに合わせることができます。お役に立てれば。
[myButton setBackgroundColor:[UIColor blueColor]];
[myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
このように変更したり、ストーリーボードで変更したり、右側のオプションの背景を変更したりすることができます。
スウィフト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)