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

Pan*_*hla 33 iphone xcode objective-c ipad

我想在点击时更改按钮颜色.我用了 :

[button setBackgroundColor:[UIColor redColor]];
Run Code Online (Sandbox Code Playgroud)

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

[click1 setBackgroundColor:[UIColor redColor] forState:UIControlStateHighlighted];
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Hen*_*rik 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];
}
Run Code Online (Sandbox Code Playgroud)

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

  • 关于你的注意:或者你可以使用` - [UIButton setBackgroundImage:forState]`方法和` - [UIButton setTitle:forState:]`.谢谢你的食谱! (5认同)
  • 这是一个很好的答案.但我会将`[self setImage:colorImage forState:state];`改为`[self setBackgroundImage:colorImage forState:state];`这样你仍然可以看到按钮的标题. (2认同)

Ond*_*rej 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
Run Code Online (Sandbox Code Playgroud)

这是实现文件:

//
//  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
Run Code Online (Sandbox Code Playgroud)

  • 如果您按下按钮并将手指拖出选择范围,则按钮的颜色将保持"_highlightedColor",而不再突出显示. (2认同)

Dig*_*ohn 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];
Run Code Online (Sandbox Code Playgroud)

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

 [self.myButton setBackgroundImage:[UIImage imageNamed:@"gradient.png"] forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

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


Gio*_*lzo 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)
    }
}
Run Code Online (Sandbox Code Playgroud)


Gya*_*ani 2

您为按钮拍摄了红色图像,然后可以在用户单击时设置它

[yourButtonName setBackgroundImage:[UIImage imageNamed:@"yourRedButton.png"] forState:UIControlStateHighlighted];
Run Code Online (Sandbox Code Playgroud)

  • 但我不想在单击按钮时仅使用图像颜色 (2认同)