iPhone:如何使用buttonType UIButtonTypeCustom设置UIButton的BackgroundColor

时间:2010-10-29 05:01:07

标签: iphone objective-c xcode ipad

我想在点击时更改按钮颜色。我用过:

[button setBackgroundColor:[UIColor redColor]];

但是这只在按钮的四个角上显示红色而不是整个按钮,当我使用forState:UIControlStateNormal时,应用程序也会挂起。 点击时按钮是否可以显示某些颜色?

[click1 setBackgroundColor:[UIColor redColor] forState:UIControlStateHighlighted];

任何帮助将不胜感激。

15 个答案:

答案 0 :(得分:38)

您可以通过编程方式创建图像,因此可以动态地使用颜色:

使用此方法为UIButton创建一个类别,并确保通过@import QuartzCore导入QuartzCore lib:

- (void)setColor:(UIColor *)color forState:(UIControlState)state
{
    UIView *colorView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
    colorView.backgroundColor = color;

    UIGraphicsBeginImageContext(colorView.bounds.size);
    [colorView.layer renderInContext:UIGraphicsGetCurrentContext()];

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

    [self setBackgroundImage:colorImage forState:state];
}

这将为您指定的颜色创建一个具有按钮大小的图像,然后将其指定为希望状态。由于使用了backgroundImage,您仍然可以通过setTitle:forState:方法为按钮设置标题。

答案 1 :(得分:14)

这就是我做的...它是UIButton的自定义子类,只需设置正常和突出显示的颜色,所有内容都可以正常工作;)

标题文件:

//
//  FTCustomButton.h
//  FTLibrary
//
//  Created by Ondrej Rafaj on 14/01/2013.
//  Copyright (c) 2013 Fuerte International. All rights reserved.
//

#import <UIKit/UIKit.h>


@interface FTCustomButton : UIButton

@property (nonatomic, strong, readonly) UIColor *normalColor;
@property (nonatomic, strong, readonly) UIColor *highlightedColor;

- (void)setNormalColor:(UIColor *)normalColor;
- (void)setHighlightedColor:(UIColor *)highlightedColor;


@end

这是实施文件:

//
//  FTCustomButton.m
//  FTLibrary
//
//  Created by Ondrej Rafaj on 14/01/2013.
//  Copyright (c) 2013 Fuerte International. All rights reserved.
//

#import "FTCustomButton.h"

//*****************************************************************************
// private interface declaration
//*****************************************************************************
@interface MCSelectionButton ()
    @property(nonatomic, strong, readwrite) UIColor *normalColor;
    @property(nonatomic, strong, readwrite) UIColor *highlightedColor;
@end

//*****************************************************************************
// public interface implementation
//*****************************************************************************

@implementation FTCustomButton


#pragma mark Settings

- (void)setNormalColor:(UIColor *)normalColor {
    [self setBackgroundColor:normalColor];
    _normalColor = normalColor;
}

- (void)setHighlightedColor:(UIColor *)highlightedColor {
    _highlightedColor = highlightedColor;
}

#pragma mark Actions

- (void)didTapButtonForHighlight:(UIButton *)sender {
    [self setBackgroundColor:_highlightedColor];
}

- (void)didUnTapButtonForHighlight:(UIButton *)sender {
    [self setBackgroundColor:_normalColor];
}

#pragma mark Initialization

- (void)setupButton {
    [self addTarget:self action:@selector(didTapButtonForHighlight:) forControlEvents:UIControlEventTouchDown];
    [self addTarget:self action:@selector(didUnTapButtonForHighlight:) forControlEvents:UIControlEventTouchUpInside];
    [self addTarget:self action:@selector(didUnTapButtonForHighlight:) forControlEvents:UIControlEventTouchUpOutside];
}

- (id)init {
    self = [super init];
    if (self) {
        [self setupButton];
    }
    return self;
}

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

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setupButton];
    }
    return self;
}


@end

答案 2 :(得分:13)

确保按钮类型是自定义的,如其他人已经说明的那样。然后执行以下操作将带回那些圆角:

 [self.myButton.layer setCornerRadius:8.0f];
 [self.myButton.layer setMasksToBounds:YES];
 [self.myButton.layer setBorderWidth:1.0f];
 [self.myButton.layer setBorderColor:[[UIColor whiteColor] CGColor]];
 self.myButton.backgroundColor = [UIColor redColor];

虽然,就个人而言,我是纯色渐变按钮的忠实粉丝......同样,背景颜色没有不同的状态,而背景图片却有:

 [self.myButton setBackgroundImage:[UIImage imageNamed:@"gradient.png"] forState:UIControlStateNormal];

使用图像,您的按钮会随着选择而变暗(或者您可以为每个状态提供不同的背景图像以执行不同的操作)。背景颜色不会发生这种情况,背景将始终保持不变,只有按钮标签按状态更改。

答案 3 :(得分:7)

完成Dima的回答,我在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)
    }
}

答案 4 :(得分:4)

我认为比任何列出的解决方案更有效的解决方案是直接在Core Graphics中绘制图像。您无需制作UIView并致电renderInContext:which can be pretty slow

+ (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;
}

您可以在UIImage类别中使用此功能来创建要在UIButton中使用的图片。

答案 5 :(得分:2)

您为按钮拍摄了红色图像,然后您可以在用户点击

时进行设置
[yourButtonName setBackgroundImage:[UIImage imageNamed:@"yourRedButton.png"] forState:UIControlStateHighlighted];

答案 6 :(得分:2)

要获得单色按钮,您可以将按钮设置为自定义按钮。 这是我已知的可用按钮api列表(您可以在将它们设置为出口后在viewDidLoad中设置它们)。 只需导入石英并更改边框半径,使其看起来像一个按钮。

//highlightcolor - this changes the status for UIControlStateHighlighted
OUTLETNAME.tintColor =  [UIColor orangeColor];

//borderradius *quartz
[[OUTLETNAME layer] setCornerRadius:20.0f];

//border *quartz
[[OUTLETNAME layer] setBorderWidth:5.0f];

//bordercolor
[OUTLETNAME.layer setBorderColor:[[UIColor greenColor] CGColor]];

//backgroundcolor 
OUTLETNAME.backgroundColor = [UIColor blackColor];

//image 
[OUTLETNAME setImage:[UIImage imageNamed:PICNAME] forState:UIControlStateNormal];

//text 
[OUTLETNAME setTitle:@"TEXT" forState:UIControlStateNormal];

//fontsize
OUTLETNAME.titleLabel.font = [UIFont systemFontOfSize:36.0];

//fontcolor
OUTLETNAME.titleLabel.textColor = [UIColor blackColor];

//fontcolor
[OUTLETNAME setTitleColor:[UIColor orangeColor] forState: UIControlStateNormal];

如果您想要具有渐变颜色的自定义按钮,则必须创建自定义按钮类。

此博客有一个光滑的按钮类项目供下载。 http://didikot.com/?p=217

我认为你必须折射并转换为ARC才能使用它。

这个博客做同样的事情,但没有光泽。 http://www.cimgf.com/2010/01/28/fun-with-uibuttons-and-core-animation-layers/

答案 7 :(得分:1)

@pankaj Gyani说正确

UIButton *button = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame:CGRectMake(0, 0, 24, 24)];
[button addTarget:self action:@selector(prevButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[button setBackgroundImage:[UIImage imageNamed:@"IntroArrowLeft.png"] forState:UIControlStateNormal];
[self addSubview:button];

答案 8 :(得分:1)

您应该将UIButton的类型设置为自定义,并为正常和突出显示的状态设置其图像或背景图像属性。

对于您可以在应用中轻松使用的专业且漂亮的按钮,this自定义按钮组件也可能有所帮助。

答案 9 :(得分:1)

你有一切正确。只需将按钮类型设置为UIButtonTypeCustom ..

即可
button =    [UIButton buttonWithType:UIButtonTypeCustom];
button.frame    =   CGRectMake(200, 8, 100, 30);
[button setTitle:@"Set up" forState:UIControlStateNormal];
[button setBackgroundColor:[UIColor greenColor]];
button.clipsToBounds    =   YES;
button.layer.cornerRadius   =   10;
button.alpha        =   0.5;

答案 10 :(得分:1)

只是对亨德里克回答的更新。

要使用自动布局,您需要将UIView框架大小设置为按钮intrinsicContentSize,否则会搞砸布局。

- (void)setColor:(UIColor *)color forState:(UIControlState)state
{
    UIView *colorView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.intrinsicContentSize.width, self.intrinsicContentSize.height)];
    colorView.backgroundColor = color;

    UIGraphicsBeginImageContext(colorView.bounds.size);
    [colorView.layer renderInContext:UIGraphicsGetCurrentContext()];

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

    [self setBackgroundImage:colorImage forState:state];
}

答案 11 :(得分:0)

将按钮类型设为自定义。

例如

button = [UIButton buttonWithType:UIButtonTypeCustom];

一切顺利。

答案 12 :(得分:0)

感谢@Dima

以下是swift 3.0的更新代码,作为UIButton扩展

extension UIButton {
  // thanks to @Dima http://stackoverflow.com/a/24665476/2581637 update code for swift 3
  func setBackgroundColor(color: UIColor, forUIControlState state: UIControlState) {
    func imageWithColor(color: UIColor) -> UIImage? {
      let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
      UIGraphicsBeginImageContext(rect.size)
      if let context = UIGraphicsGetCurrentContext() {
        context.setFillColor(color.cgColor)
        context.fill(rect)
      }

      let image = UIGraphicsGetImageFromCurrentImageContext()
      UIGraphicsEndImageContext()

      return image
    }

    self.setBackgroundImage(imageWithColor(color: color), for: state)
  }
}

答案 13 :(得分:-1)

  1. 在.xib中 - 设置按钮类型:自定义。
  2. 根据需要设置背景颜色。

答案 14 :(得分:-2)

 UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom];


 [button1 setBackgroundColor:[UIColor redColor]];