IPhone: как установить BackgroundColor UIButton с помощью кнопки type UIButtonTypeCustom
Я хочу изменить цвет кнопки при нажатии. Я использовал:
[button setBackgroundColor:[UIColor redColor]];
но это показывает красный цвет только на четырех углах кнопки не на всей кнопке, а также когда я использую forState:UIControlStateNormal
, тогда приложение зависает.
Есть ли способ показать цвет на кнопке при нажатии?
[click1 setBackgroundColor:[UIColor redColor] forState:UIControlStateHighlighted];
Любая помощь будет оценена.
Ответы
Ответ 1
Вы можете создать изображение программно и, следовательно, иметь возможность использовать свои цвета динамическим способом:
Создайте категорию для UIButton с помощью этого метода и обязательно импортируйте файл QuartzCore через @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:.
Ответ 2
Это то, что я делаю... это настраиваемый подкласс 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
Ответ 3
Убедитесь, что тип кнопки является обычным, как кто-то уже заявил. Затем выполните следующие действия, чтобы вернуть эти закругленные углы:
[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];
Используя изображение, ваша кнопка будет затемняться с выбором (или вы можете предоставить другое фоновое изображение для каждого состояния, чтобы сделать что-то другое). Этого не произойдет с цветом фона, фон всегда останется неизменным, только ваша метка кнопки изменится на состояние.
Ответ 4
Завершение ответа Димы, я реализовал расширение в 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)
}
}
Ответ 5
Я считаю, что более эффективное решение, чем любой из перечисленных, - это просто нарисовать изображение в 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
.
Ответ 6
у вас есть красное цветное изображение для вашей кнопки, а затем вы можете установить его, когда пользователь нажимает
[yourButtonName setBackgroundImage:[UIImage imageNamed:@"yourRedButton.png"] forState:UIControlStateHighlighted];
Ответ 7
Чтобы получить кнопку с одним цветом, вы можете установить кнопку на пользовательскую кнопку.
Вот мой известный список доступных кнопок 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/
Ответ 8
@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];
Ответ 9
Вы должны установить тип UIButton для пользовательских и установить его свойства изображения или фонового изображения для нормальных и выделенных состояний.
Для профессиональных и приятных кнопок, которые вы можете легко использовать в своих приложениях этот пользовательский компонент кнопки также может помочь.
Ответ 10
У вас все правильно. Просто введите свой тип кнопки в 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;
Ответ 11
Просто обновление для ответа Хендрика.
Чтобы хорошо работать с Auto Layout, вам нужно установить размер кадра 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];
}
Ответ 12
Введите тип кнопки как пользовательский.
Например,
button = [UIButton buttonWithType:UIButtonTypeCustom];
Все самое лучшее.
Ответ 13
Благодаря @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)
}
}
Ответ 14
- В .xib - установить Тип кнопки: Пользовательский.
- Установите цвет фона по вашему желанию.
Ответ 15
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom];
[button1 setBackgroundColor:[UIColor redColor]];