Можно ли изменить цвет фона UIButtons?

У меня есть я в тупике.

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

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

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

  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

edit: всем новым читателям вы также должны рассмотреть несколько вариантов, добавленных как «другая возможность». для вас.

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

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

 [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

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

Если вы установите фоновые изображения в Interface Builder, вы заметите, что 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), если вы не хотите, чтобы вы выбрали состояние.

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

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

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

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

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

Подclass 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]; } 

цветной UIButton

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

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

 #import  colorizeOverlayView.layer.cornerRadius = 10.0f; colorizeOverlayView.layer.masksToBounds = YES; 

Другая возможность (лучший и самый красивый imho):

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

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

 [segmentedButton removeSegmentAtIndex:1 animated:NO]; 

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

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

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

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

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

По предложению @EthanB и @karim, создав обратный заполненный прямоугольник, я просто создал категорию для UIButton, чтобы достичь этого.

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

Применение:

 [button setBackgroundColor:uiTextColor forState:UIControlStateDisabled]; 

Необязательный forStates для использования:

 UIControlStateNormal UIControlStateHighlighted UIControlStateDisabled UIControlStateSelected 

Вы также можете добавить кнопку 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]; } 

добавьте вторую цель для UIButton для UIControlEventTouched и измените UIButton фона UIButton . Затем измените его обратно в цель UIControlEventTouchUpInside ;

Для профессиональных и симпатичных кнопок вы можете проверить этот компонент пользовательской кнопки . Вы можете использовать его непосредственно в своих представлениях и таблицах или изменить исходный код, чтобы он соответствовал вашим потребностям. Надеюсь это поможет.

Это не так элегантно, как суб-class UIButton, однако, если вы просто хотите что-то быстро – то, что я сделал, это создать пользовательскую кнопку, а затем изображение 1px на 1px с цветом, которым я бы хотел, чтобы кнопка была, и установить фон кнопки для этого изображения для выделенного состояния – работает для моих нужд.

Я знаю, что это было задано давно, и теперь появилась новая UIButtonTypeSystem. Но новые вопросы отмечаются как дубликаты этого вопроса, так что вот мой новый ответ в контексте кнопки системы iOS 7, используйте свойство .tintColor .

 let button = UIButton(type: .System) button.setTitle("My Button", forState: .Normal) button.tintColor = .redColor() 

[myButton setBackgroundColor:[UIColor blueColor]]; [myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

Это возможно изменить этот путь или пойти на Раскадровка и изменить фон на опциях в правой части.

Swift 3:

  static func imageFromColor(color: UIColor, width: CGFloat, height: CGFloat) -> UIImage { let rect = CGRect(x: 0, y: 0, width: width, height: height); UIGraphicsBeginImageContext(rect.size) let context = UIGraphicsGetCurrentContext()! context.setFillColor(color.cgColor) context.fill(rect) let img = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return img; } let button = UIButton(type: .system) let image = imageFromColor(color: .red, width: button.frame.size.width, height: button.frame.size.height) button.setBackgroundImage(image, for: .normal) 
  • NSTimeZone: в чем разница между localTimeZone и systemTimeZone?
  • как сделать программный снимок экрана для iPhone?
  • Как включить / выключить флэш-память iPhone?
  • Сравнение двух NSDates и игнорирование временной составляющей
  • Как я могу «разрезать» прозрачное отверстие в UIImage?
  • Какова стоимость использования автореферата в cocoa?
  • Можно ли перепроектировать мое приложение iPhone?
  • как правильно использовать insertRowsAtIndexPaths?
  • Выясните, кадр UIBarButtonItem в окне?
  • Как получить размер NSString
  • Процедура отправки сообщений iOS 6 Facebook заканчивается ошибкой «remote_app_id не соответствует сохраненному id»
  • Давайте будем гением компьютера.