2011-01-26 2 views
0

Я новичок в программировании, и любая помощь приветствуется. Я пытаюсь изменить цвет фона кнопки после ее нажатия. Я попробовал setBackgroundColor без успеха. Я не уверен, что он совместим с UIButton. Есть ли способ программно выполнить такую ​​задачу? Все мысли и предложения приветствуются.Цель C - Помощь при изменении цвета фона при нажатии UIButton

ответ

3

Я предлагаю создать простое изображение, которое содержит нужный цвет фона, и установить его с помощью существующих методов в 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"); 
} 

Это должно сделать трюк. Там может быть даже лучше, чтобы создать необходимое изображение на лета, но это материал, я не тверд в

. [Править: немного более многословный код]

+0

Таким образом, вам нужно создать пользовательскую кнопку. Да? Чтобы убедиться, что я понимаю код, строка 1 определяет местоположение файла png с именем buttonBG. fileLocation - это имя переменной. Строка 2 присваивает изображение. Я не уверен, что! = Означает, поэтому мне сложно понять «заявление». Я очень ценю ваше время и помощь. –

+0

Сделал код немного более подробным, я надеюсь, что это лучше понять. Да, fileLocation - это переменная, которая будет содержать путь к ресурсу (включенному в ваше приложение) с именем файла 'buttonBG.png'. строка два (три сейчас) создает изображение в переменной bgImage. Оператор if проверяет, все ли правильно, и изображение на самом деле там, а затем назначает его. – LordT

+0

Прохладный! Спасибо за вашу помощь. –

1

Проверьте UIButton Class Reference.

Обычные UIButtons не имеют опции backgroundColor.

Мое предложение было бы использовать UISegmentedControl, в котором есть опция tinColor.

+0

Это то, чего я боялся. Благодарю. –

2

Предполагая, что у вас есть неукрашенная пользовательская кнопка с названием «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]]; 

    } 
} 

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

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

+0

Я вижу, что вы имеете в виду только по углам. Поэтому, чтобы изменить общий фон, я бы предположил, что пользовательский образ - это способ, основанный на вашем предположении. –

+0

Да. Это то, что хочется большую часть времени. UIButton - это просто взгляд с некоторыми методами, чтобы сделать его ответчиком. –

2

У меня только одна проблема, и я решил использовать подкласс 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

0

Я создал подкласс, который получает цвет фона и создает 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; 
} 

Фактически вы можете использовать его в раскадровке, сменив класс и установив цвет фона в представлении.

Смежные вопросы