Можно ли изменить цвет фона UIButtons? - PullRequest
105 голосов
/ 11 мая 2010

Это меня поставило в тупик.

Можно ли вообще изменить цвет фона кнопки UIButton в Какао для iPhone. Я попытался установить цвет фона, но он только меняет углы. setBackgroundColor: кажется единственным методом, доступным для таких вещей.

[random setBackgroundColor:[UIColor blueColor]];
[random.titleLabel setBackgroundColor:[UIColor blueColor]];

Ответы [ 16 ]

158 голосов
/ 05 апреля 2011

Это можно сделать программным путем, сделав копию:

    loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [loginButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    loginButton.backgroundColor = [UIColor whiteColor];
    loginButton.layer.borderColor = [UIColor blackColor].CGColor;
    loginButton.layer.borderWidth = 0.5f;
    loginButton.layer.cornerRadius = 10.0f;

изменить: конечно, вам нужно будет #import <QuartzCore/QuartzCore.h>

edit: для всех новых читателей вы также должны рассмотреть несколько добавленных опций как «еще одну возможность». на ваше рассмотрение.

Поскольку это старый ответ, я настоятельно рекомендую прочитать комментарии для устранения неполадок

59 голосов
/ 17 февраля 2012

У меня другой подход,

[btFind setTitle:NSLocalizedString(@"Find", @"") forState:UIControlStateNormal];    
[btFind setBackgroundImage:[CommonUIUtility imageFromColor:[UIColor cyanColor]] 
        forState:UIControlStateNormal];
btFind.layer.cornerRadius = 8.0;
btFind.layer.masksToBounds = YES;
btFind.layer.borderColor = [UIColor lightGrayColor].CGColor;
btFind.layer.borderWidth = 1;

Из CommonUIUtility,

+ (UIImage *) imageFromColor:(UIColor *)color {
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    //  [[UIColor colorWithRed:222./255 green:227./255 blue: 229./255 alpha:1] CGColor]) ;
    CGContextFillRect(context, rect);
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

Не забудьте #import <QuartzCore/QuartzCore.h>

32 голосов
/ 11 мая 2010

Полагаю, вы говорите о кнопке UIB с UIButtonTypeRoundedRect? Вы не можете изменить цвет фона этого. Когда вы пытаетесь изменить его цвет фона, вы скорее меняете цвет прямоугольника, на котором нарисована кнопка (что обычно ясно). Так что есть два пути. Либо вы создаете подкласс UIButton и перезаписываете его метод -drawRect:, либо вы создаете изображения для различных состояний кнопок (что совершенно нормально).

Если вы устанавливаете фоновые изображения в Интерфейсном Разработчике, вы должны заметить, что IB не поддерживает установку изображений для всех состояний, которые может иметь кнопка, поэтому я рекомендую устанавливать изображения в коде следующим образом:

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setBackgroundImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[myButton setBackgroundImage:[UIImage imageNamed:@"disabled.png"] forState:UIControlStateDisabled];
[myButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected];
[myButton setBackgroundImage:[UIImage imageNamed:@"higligted.png"] forState:UIControlStateHighlighted];
[myButton setBackgroundImage:[UIImage imageNamed:@"highlighted+selected.png"] forState:(UIControlStateHighlighted | UIControlStateSelected)];

Последняя строка показывает, как установить изображение для выбранного и выделенного состояния (это то, что IB не может установить). Вам не нужны выбранные изображения (строки 4 и 6), если ваша кнопка не нуждается в выбранном состоянии.

28 голосов
/ 24 февраля 2012

Другая возможность:

  1. Создание UIButton в Интерфейсном конструкторе.
  2. Дайте ему тип 'Custom'
  3. Теперь в IB можно изменить цвет фона

Однако кнопка квадратная, и это не то, что мы хотим. Создайте IBOutlet со ссылкой на эту кнопку и добавьте в метод viewDidLoad следующее:

[buttonOutlet.layer setCornerRadius:7.0f];
[buttonOutlet.layer setClipToBounds:YES];

Не забудьте импортировать QuartzCore.h

17 голосов
/ 20 мая 2012

Подкласс UIButton и методы переопределения setHighlighted и setSelected

-(void) setHighlighted:(BOOL)highlighted {

  if(highlighted) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setHighlighted:highlighted];
}

-(void) setSelected:(BOOL)selected {

  if(selected) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setSelected:selected];
}

Мой метод darkerShade относится к категории UIColor, подобной этой

-(UIColor*) darkerShade {

  float red, green, blue, alpha;
  [self getRed:&red green:&green blue:&blue alpha:&alpha];

  double multiplier = 0.8f;
  return [UIColor colorWithRed:red * multiplier green:green * multiplier blue:blue*multiplier alpha:alpha];
}
7 голосов
/ 17 апреля 2012

Еще одна возможность (самый лучший и самый красивый imho):

Создайте UISegmentedControl с 2 сегментами нужного цвета фона в Интерфейсном Разработчике. Установите тип «бар». Затем измените его на наличие только одного сегмента. Построитель интерфейса не принимает один сегмент, поэтому вы должны сделать это программно.

Поэтому создайте IBOutlet для этой кнопки и добавьте его в viewDidLoad вашего представления:

[segmentedButton removeSegmentAtIndex:1 animated:NO];

Теперь у вас есть красивая глянцевая цветная кнопка с указанным цветом фона. Для действий используйте событие «значение изменено».

(Я нашел это на http://chris -software.com / index.php / 2009/05/13 / creation-a-nice-glass-buttons / ). Спасибо Крис!

7 голосов
/ 23 ноября 2011

colored UIButton

Если вы не хотите использовать изображения и хотите, чтобы они выглядели в точности как стиль Rounded Rect, попробуйте это. Просто поместите UIView поверх UIButton с идентичной рамкой и маской автоматического изменения размера, установите альфа на 0,3 и установите цвет фона. Затем используйте фрагмент ниже, чтобы обрезать закругленные края от цветного наложения. Кроме того, снимите флажок «Взаимодействие с пользователем включено» в IB на UIView, чтобы разрешить каскадным событиям каскадно опускаться вниз к UIButton.

Одним из побочных эффектов является то, что ваш текст также будет раскрашен.

#import <QuartzCore/QuartzCore.h>

colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;
5 голосов
/ 11 мая 2010

Ну, я на 99% уверен, что вы не можете просто пойти и изменить цвет фона кнопки UIB. Вместо этого вы должны сами пойти и изменить фоновые изображения, что я считаю болью. Я поражен, что я должен был сделать это.

Если я не прав или если есть лучший способ без установки фоновых изображений, пожалуйста, сообщите мне

[random setBackgroundImage:[UIImage imageNamed:@"toggleoff.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor darkTextColor] forState:UIControlStateNormal];


[random setBackgroundImage:[UIImage imageNamed:@"toggleon.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
2 голосов
/ 17 марта 2015

В соответствии с предложением @EthanB и @karim, создающим задний прямоугольник, я просто создал категорию для кнопки UIB для достижения этой цели.

Просто введите код категории: https://github.com/zmonteca/UIButton-PLColor

Использование:

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

Необязательно для использования государствами:

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected
2 голосов
/ 17 октября 2012

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

+(void)makeButtonColored:(UIButton*)button color1:(UIColor*) color
{

    CALayer *layer = button.layer;
    layer.cornerRadius = 8.0f;
    layer.masksToBounds = YES;
    layer.borderWidth = 4.0f;
    layer.opacity = .3;//
    layer.borderColor = [UIColor colorWithWhite:0.4f alpha:0.2f].CGColor;

    CAGradientLayer *colorLayer = [CAGradientLayer layer];
    colorLayer.cornerRadius = 8.0f;
    colorLayer.frame = button.layer.bounds;
    //set gradient colors
    colorLayer.colors = [NSArray arrayWithObjects:
                         (id) color.CGColor,
                         (id) color.CGColor,
                         nil];

    //set gradient locations
    colorLayer.locations = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0f],
                            [NSNumber numberWithFloat:1.0f],
                            nil];


    [button.layer addSublayer:colorLayer];

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