Цель C - Помощь в изменении цвета фона при нажатии кнопки UIB - PullRequest
0 голосов
/ 27 января 2011

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

Ответы [ 5 ]

3 голосов
/ 27 января 2011

Я бы предложил создать простое изображение, которое содержит желаемый цвет фона, и установить его с помощью существующих методов в UIButton.(проверьте Ответ Wrights для ссылки документа).

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");
}

Это должно сработать.Возможно, есть еще лучший способ создать необходимое изображение на лету, но я не уверен, что это не так.

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

2 голосов
/ 06 сентября 2012

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

  • Сначала добавьте свойства для слоев. Я создал два слоя, один для базового градиента и один для глянца, чтобы добавить немного стиля.

     @interface gradientButton()
     @property (nonatomic, strong) CAGradientLayer* gradientLayer;
     @property (nonatomic, strong) CAGradientLayer* glossyLayer;
     @end
    
  • Затем либо в -(void)awakeFromNib, либо в -(id)initWithFrame:(CGRect)frame , в зависимости от того, будете ли вы загружать из раскадровки или кода соответственно, настроить градиенты и добавить слои, скруглить углы и настроить цвет подсветки шрифта. 1012 *

     -(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]]];
     }
    
  • Там у нас это есть, теперь просто перетащите UIB-кнопку, измените класс и все в порядке. Вот полная реализация, так что вы можете скопировать ее прямо. http://pastebin.com/nUVeujyp

2 голосов
/ 27 января 2011

Предполагается, что у вас есть незакрашенная пользовательская кнопка с заголовком «Вкл.» Для нормального состояния:

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

    }
}

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

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

1 голос
/ 08 октября 2013

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

Проверьте Ссылку класса UIB .

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

Мое предложение будет использовать UISegmentedControl, чтоимеет опцию tinColor.

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