2010-10-29 3 views
33

Я хочу изменить цвет кнопки при ее нажатии. Я использовал:iPhone: Как установить BackgroundColor UIButton с кнопкойType UIButtonTypeCustom

[button setBackgroundColor:[UIColor redColor]]; 

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

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

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

ответ

2

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

[yourButtonName setBackgroundImage:[UIImage imageNamed:@"yourRedButton.png"] forState:UIControlStateHighlighted]; 
+2

но Я не хочу использовать только цвет изображения, когда нажимается кнопка –

+0

нет способа, как то, что вы пытаетесь – Gyani

0

сделать тип кнопки как обычай.

Например

button = [UIButton buttonWithType:UIButtonTypeCustom]; 

Все самое лучшее.

+0

, но пользователь удаляет круглую кнопку .I думаю, никто не захочет этого, я думаю, что мне нужно использовать изображение вместо этого, которое я никогда не использовал для использования –

+0

Даже если вы используете изображение, вы должны сделать тип кнопки как обычай для хорошего внешнего вида. Почувствуйте разницу. Попробуйте. – Warrior

1

@pankaj Гиани говорит правильно

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]; 
+0

Вы можете редактировать свой собственный пост, вместо того чтобы отвечать на него несколько раз. – Warrior

+0

yeah warrior is right –

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

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

-1
  1. В .xib - комплект Тип кнопки: Пользовательский.
  2. Установить цвет фона по вашему желанию.
-2
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom]; 


[button1 setBackgroundColor:[UIColor redColor]]; 
+2

Этот датчик не установил цвет для состояния – richy

+0

он не работает – OMGPOP

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/

1

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

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

14

Это то, что я делаю ... это пользовательский подкласс UIButton, просто установить нормальные и выделены цвета и все, shpould отлично работает;)

Заголовочный файл:

// 
// 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 
+0

@ cabellicar123 Я думаю, что ваше предлагаемое редактирование должно было быть комментарием. –

+2

Если вы нажмете кнопку и вытащите палец из диапазона выбора, то цвет кнопки останется «_highlightedColor», в то время как он больше не подсвечивается. – Laszlo

37

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

Создание категории 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:.

+5

о вашем ПРИМЕЧАНИЕ. Или вы можете просто использовать '- [UIButton setBackgroundImage: forState]' метод с '- [UIButton setTitle: forState:]'. Спасибо за рецепт! – Zapko

+2

Это отличный ответ. Но я бы изменил '[self setImage: colorImage forState: state];' to '[self setBackgroundImage: colorImage forState: state];' таким образом вы все равно можете увидеть заголовок кнопки. – palme

+1

Спасибо, ребята, я обновил свой ответ – Hendrik

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; 
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]; 
} 
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.

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) 
    } 
} 
0

Благодаря @Dima

Вот обновленный код для быстрой версии 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) 
    } 
} 
Смежные вопросы