Я новичок в программировании, и любая помощь приветствуется. Я пытаюсь изменить цвет фона кнопки после ее нажатия. Я попробовал setBackgroundColor без успеха. Я не уверен, что он совместим с UIButton. Есть ли способ программно выполнить такую задачу? Все мысли и предложения приветствуются.Цель C - Помощь при изменении цвета фона при нажатии UIButton
ответ
Я предлагаю создать простое изображение, которое содержит нужный цвет фона, и установить его с помощью существующих методов в UIButton. (проверьте ответ Wrights для ссылки doc).
UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
NSString* fileLocation = [[NSBundle mainBundle] pathForResource:@"buttonBG" ofType:@"png"];
UIImage* bgImage = [UIImage imageWithContentsOfFile:fileLocation];
if (bgImage != nil) { // check if the image was actually set
[button setBackgroundImage:bgImage forState:UIControlStateHighlighted];
} else {
NSLog(@"Error trying to read the background image");
}
Это должно сделать трюк. Там может быть даже лучше, чтобы создать необходимое изображение на лета, но это материал, я не тверд в
. [Править: немного более многословный код]
Проверьте UIButton Class Reference.
Обычные UIButtons не имеют опции backgroundColor
.
Мое предложение было бы использовать UISegmentedControl
, в котором есть опция tinColor
.
Это то, чего я боялся. Благодарю. –
Предполагая, что у вас есть неукрашенная пользовательская кнопка с названием «On» для нормального состояния:
- (IBAction) toggleButtonState {
if ([toggleButton titleForState:UIControlStateNormal] == @"On") {
[toggleButton setTitle: @"Off" forState:UIControlStateNormal];
[toggleButton setBackgroundColor:[UIColor redColor]];
}
else {
[toggleButton setTitle: @"On" forState:UIControlStateNormal];
[toggleButton setBackgroundColor:[UIColor greenColor]];
}
}
Все остальные кнопки имеют изображение, помещенное перед видом, так что в лучшем случае вы будете видеть, что углы изменится, если изображение не полностью заполните пробел.
Я также предлагаю использовать изображение, но для учебных целей это будет работать.
Я вижу, что вы имеете в виду только по углам. Поэтому, чтобы изменить общий фон, я бы предположил, что пользовательский образ - это способ, основанный на вашем предположении. –
Да. Это то, что хочется большую часть времени. UIButton - это просто взгляд с некоторыми методами, чтобы сделать его ответчиком. –
У меня только одна проблема, и я решил использовать подкласс UIButton для решения этой проблемы. Я использовал градиенты просто потому, что выглядел немного лучше, если вам не нужно их, вы можете просто удалить их. Я объяснил процесс, который я использовал, и включил полный код в нижней части сообщения.
Во-первых, добавить свойства для layers.I созданы два слоя один для базового градиента и один для блеска, чтобы добавить немного стиля.
@interface gradientButton() @property (nonatomic, strong) CAGradientLayer* gradientLayer; @property (nonatomic, strong) CAGradientLayer* glossyLayer; @end
Тогда либо в
-(void)awakeFromNib
или в-(id)initWithFrame:(CGRect)frame
, в зависимости от того, если вы будете загружать из раскадровки или кода соответственно, настроить градиенты и добавить слои, вокруг своих углов от и настроить цвет выделения шрифта.-(void)awakeFromNib { _gradientLayer = [[CAGradientLayer alloc] init]; _gradientLayer.bounds = self.bounds; _gradientLayer.position = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); [self.layer insertSublayer:_gradientLayer atIndex:0]; self.layer.cornerRadius = 5.0f; self.layer.masksToBounds = YES; self.layer.borderWidth = 1.0f; _glossyLayer = [[CAGradientLayer alloc] init]; _glossyLayer.bounds = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height/2); _glossyLayer.position = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/4); [self.layer addSublayer:_glossyLayer]; [self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [self setTitleColor:[UIColor yellowColor] forState:UIControlStateHighlighted]; }
Далее переопределить
- (void)drawRect:(CGRect)rect
, чтобы применить ваши слои и определять цвета.#define GRADIENT_TOP [UIColor colorWithRed:38.0/255.0 green:78.0/255.0 blue:54.0/255.0 alpha:1] #define GRADIENT_BOTTOM [UIColor colorWithRed:44.0/255.0 green:71.0/255.0 blue:56.0/255.0 alpha:1] #define GLOSS_TOP [UIColor colorWithRed:0.70f green:0.70f blue:0.70f alpha:0.95f] #define GLOSS_BOTTOM [UIColor colorWithRed:0.70f green:0.70f blue:0.70f alpha:0.35f] #define GRADIENT_SELECTED_TOP [UIColor colorWithRed:138.0/255.0 green:178.0/255.0 blue:154.0/255.0 alpha:1] #define GRADIENT_SELECTED_BOTTOM [UIColor colorWithRed:114.0/255.0 green:171.0/255.0 blue:156.0/255.0 alpha:1] - (void)drawRect:(CGRect)rect { [_gradientLayer setColors:@[(id)[GRADIENT_TOP CGColor],(id)[GRADIENT_BOTTOM CGColor]]]; [_glossyLayer setColors:@[(id)[GLOSS_TOP CGColor], (id)[GLOSS_BOTTOM CGColor]]]; [super drawRect:rect]; }
Наконец, и немного мы все ждали, переопределения
-(void)setHighlighted:(BOOL)highlighted{
поэтому мы можем применить эффект выделения искали.-(void)setHighlighted:(BOOL)highlighted{ [super setHighlighted:highlighted]; if(highlighted) [_gradientLayer setColors:@[(id)[GRADIENT_SELECTED_TOP CGColor],(id)[GRADIENT_SELECTED_BOTTOM CGColor]]]; else [_gradientLayer setColors:@[(id)[GRADIENT_TOP CGColor],(id)[GRADIENT_BOTTOM CGColor]]]; }
Там у нас есть, теперь просто влачить UIButton изменить класс и все ваши хорошие.Ешьте полную реализацию, чтобы вы могли ее скопировать. http://pastebin.com/nUVeujyp
Я создал подкласс, который получает цвет фона и создает UIImage для каждого состояния. Для меня более полезно подкласс, а не категория, так что это зависит от вас.
@implementation ROCRoundColorButton
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
UIColor *darkColor;
darkColor = [self darkColorFromBackgroundColor];
[self setBackgroundImage:[self imageWithColor:self.backgroundColor withSize:self.frame.size] forState:UIControlStateNormal];
[self setBackgroundImage:[self imageWithColor:darkColor withSize:self.frame.size] forState:UIControlStateSelected];
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
UIColor *darkColor;
darkColor = [self darkColorFromBackgroundColor];
[self setBackgroundImage:[self imageWithColor:self.backgroundColor withSize:self.frame.size] forState:UIControlStateNormal];
[self setBackgroundImage:[self imageWithColor:darkColor withSize:self.frame.size] forState:UIControlStateSelected];
}
return self;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
#pragma mark -
#pragma mark Private methods
- (UIColor *)darkColorFromBackgroundColor
{
const float* components = CGColorGetComponents(self.backgroundColor.CGColor);
CGFloat red = components[0];
CGFloat green = components[1];
CGFloat blue = components[2];
CGFloat alpha = components[3];
if (red > 0) {
red -= 0.1;
}
if (green > 0) {
green -= 0.1;
}
if (blue > 0) {
blue -= 0.1;
}
UIColor *darkColor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
return darkColor;
}
- (UIImage *)imageWithColor:(UIColor *)color withSize:(CGSize)size
{
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
//CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height));
UIBezierPath *roundedRect = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, size.width, size.height) cornerRadius:5];
[roundedRect fillWithBlendMode: kCGBlendModeNormal alpha:1.0f];
[color setFill];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
Фактически вы можете использовать его в раскадровке, сменив класс и установив цвет фона в представлении.
- 1. При изменении цвета фона нажмите
- 2. Изменение линейного цвета фона фона при нажатии
- 3. Цель c сменить цвет фона при нажатии клавиши клавиатуры
- 4. WPF flash при изменении цвета заливки/фона
- 5. Быстрое изменение цвета фона кнопки и цвета изображения при нажатии
- 6. UIButton исчезает при нажатии
- 7. Нужна анимация при изменении цвета фона
- 8. Тип несоответствия при изменении цвета фона ячейки
- 9. Изменение цвета текста при изменении фона (javascript)
- 10. ActionBar исчезает при изменении цвета фона
- 11. Инвертировать цвет значка при изменении цвета фона?
- 12. Тестирование при изменении цвета фона UIImage
- 13. Ошибка при изменении цвета фона приложений Android
- 14. Анимация цвета фона UILabel при изменении текста
- 15. имитировать изменение цвета фона при нажатии ссылки
- 16. Изменение цвета фона при нажатии экрана
- 17. Android: Изменение цвета фона ClickableSpan при нажатии
- 18. Изменение цвета фона TextView при нажатии
- 19. Изменение цвета фона кнопки при нажатии
- 20. Изменение цвета фона для TableRows при нажатии
- 21. Как изменить цвет фона UIButton при быстром нажатии?
- 22. Изменение цвета фона Toglebutton при нажатии на GTK3 (язык C)
- 23. Изменение цвета фона при нажатии текстового поля на C#
- 24. Изменение цвета фона UIButton
- 25. Изменения цвета текста TextView при изменении цвета фона
- 26. Неисправность при изменении цвета кнопки при каждом нажатии
- 27. UIButton перемещается при нажатии
- 28. UIButton подсвечивается при нажатии
- 29. redraw UIButton при нажатии
- 30. Изменение цвета фона фона при каждом нажатии div
Таким образом, вам нужно создать пользовательскую кнопку. Да? Чтобы убедиться, что я понимаю код, строка 1 определяет местоположение файла png с именем buttonBG. fileLocation - это имя переменной. Строка 2 присваивает изображение. Я не уверен, что! = Означает, поэтому мне сложно понять «заявление». Я очень ценю ваше время и помощь. –
Сделал код немного более подробным, я надеюсь, что это лучше понять. Да, fileLocation - это переменная, которая будет содержать путь к ресурсу (включенному в ваше приложение) с именем файла 'buttonBG.png'. строка два (три сейчас) создает изображение в переменной bgImage. Оператор if проверяет, все ли правильно, и изображение на самом деле там, а затем назначает его. – LordT
Прохладный! Спасибо за вашу помощь. –