iPhone: Как установить BackgroundColor UIButton с помощью кнопкиType UIButtonTypeCustom - PullRequest
33 голосов
/ 29 октября 2010

Я хочу изменить цвет кнопки при ее нажатии. Я использовал:

[button setBackgroundColor:[UIColor redColor]];

но это показывает красный цвет только на четырех углах кнопки, а не на всей кнопке, а также, когда я использую forState:UIControlStateNormal, приложение зависает. Есть ли какой-нибудь способ показать какой-нибудь цвет на кнопке при нажатии?

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

Любая помощь будет оценена.

Ответы [ 15 ]

38 голосов
/ 07 июня 2013

Вы можете создать изображение программно, и у вас есть возможность динамически использовать ваши цвета:

Создайте категорию для UIButton этим методом и убедитесь, что QuartzCore lib импортирован через @import QuartzCore:

- (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: method.

14 голосов
/ 14 января 2013

Это то, что я делаю ... это пользовательский подкласс 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
13 голосов
/ 24 октября 2011

Убедитесь, что тип кнопки является пользовательским, как кто-то другой уже заявил. Затем выполнение следующих действий вернет эти закругленные углы:

 [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];

Используя изображение, ваша кнопка будет затемняться при выделении (или вы можете предоставить другое фоновое изображение для каждого состояния, чтобы сделать что-то другое). Это не произойдет с цветом фона, фон всегда останется прежним, только метка кнопки меняется в зависимости от состояния.

7 голосов
/ 24 ноября 2014

Завершая ответ Димы, я реализовал расширение в 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 голосов
/ 10 июля 2014

Я считаю, что более эффективное решение, чем любое из перечисленных, - это просто нарисовать изображение непосредственно в Core Graphics. Вам не нужно делать UIView и звонить renderInContext:, , что может быть довольно медленным .

+ (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.

2 голосов
/ 28 апреля 2012

Чтобы получить кнопку с одним цветом, вы можете установить кнопку на пользовательскую кнопку. Вот мой известный список доступных кнопок 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/

2 голосов
/ 29 октября 2010

у вас есть красный цвет изображения для вашей кнопки, а затем вы можете установить его, когда пользователь нажимает

[yourButtonName setBackgroundImage:[UIImage imageNamed:@"yourRedButton.png"] forState:UIControlStateHighlighted];
1 голос
/ 05 июня 2014

Просто обновление для ответа Хендрика.

Для правильной работы с автоматической компоновкой необходимо установить размер кадра 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];
}
1 голос
/ 28 октября 2013

У вас все правильно. Просто установите тип кнопки на 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;
1 голос
/ 15 июня 2012

Вы должны установить тип UIButton на custom и установить его свойства изображения или фона для нормальных и выделенных состояний.

Для профессиональных и приятных на вид кнопок, которые вы можете легко использовать в своих приложениях этот компонент пользовательских кнопок также может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...