2010-05-11 5 views
100

Этот человек меня озадачил.Можно ли изменить цвет фона UIButtons?

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

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

вы можете исправить изображение, или удалить его? kthx;) – stigi

+0

o-0 hmmmm ....., Изображение было прекрасное, но теперь оно больше не появится. Просто удалил его – dubbeat

+0

Это дубликат http://stackoverflow.com/questions/372731/how-can-i-set-a-button-background-color-on-iphone –

ответ

154

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

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>

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

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

+0

Я пробовал ваш код, но он не работал для меня – pankaj

+3

не работал, или вы не получили ожидаемый результат? –

+1

Лучший ответ еще кварц FTW – 2011-05-21 03:53:48

5

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

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

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

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

32

Я предполагаю, что вы говорите о UIButton с UIButtonTypeRoundedRect? Вы не можете изменить цвет фона. Когда вы пытаетесь изменить цвет фона, вы скорее меняете цвет прямоугольника, на который нарисована кнопка (что обычно ясно). Итак, есть два пути. Либо вы подкласса 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). Вам не нужны выбранные изображения (строка 6), если вы не хотите, чтобы вы выбрали состояние.

+0

Спасибо за объяснение. Просто быстрый вопрос. Если я переписываю метод drawrect, я предполагаю, что это связано с использованием библиотеки чертежей? Что-то в этом роде программно рисует округлый прямоугольник и наполняет его цветом? – dubbeat

+2

Я только что сделал короткий запрос Google для «круглых углов вокруг iphone» и нашел это: http://iphonedevelopment.blogspot.com/2008/11/creating-transparent-uiviews-rounded.html Проверьте метод drawrect для Например, как рисовать круглый прямоугольник. Вы можете использовать 'CGContextSetFillColorWithColor' и' CGContextFillPath', чтобы заполнить путь, нарисованный 'CGContextAddArcToPoint'. – stigi

+0

Это здорово.Большое спасибо – dubbeat

1

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

7

colored UIButton

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

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

#import <QuartzCore/QuartzCore.h> 

colorizeOverlayView.layer.cornerRadius = 10.0f; 
colorizeOverlayView.layer.masksToBounds = YES; 
59

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

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

+2

Приятный. Я обнаружил, что мне нужно добавить 'btFind.layer.borderWidth = 1;' – DefenestrationDay

+0

Мне нравится это решение, но на данный момент я не могу его использовать. Я получаю сообщение об ошибке, потому что «CommonUIUtility» не найден. Google просто дает мне материал затмения, но я думаю, он должен быть в QuartzCore? Любые идеи? – Stephan

+0

Нет, это пользовательский класс для работы с обычными продуктами UI в приложении. Вы пишете метод imageFromColor в своем классе. – karim

26

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

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

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

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

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

+7

Отлично, спасибо! Я не уверен, что это из-за версии iOS, которую я использую (5.1), но setClipToBounds недоступен. Вместо этого я использовал buttonOutlet.layer.masksToBounds = TRUE; – iforce2d

+0

Когда я добавляю этот код, он показывает закругленный прямоугольник, но когда я нажимаю на него, кнопка не отменяет выделение. Что происходит? – Will

+0

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

7

Другая возможность (самый лучший и самый красивый 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/). Спасибо Крису!

16

Подкласс 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]; 
} 

метод My 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]; 
} 
1

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

2

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

} 
+0

Блестящий !!!!!! Но нельзя было вызывать несколько раз против той же кнопки. Возможно, но новые слои добавляются снова и снова. –

+0

@StanJames: Редактирование кода должно быть предложено комментарием (или, если необходимо, вашим собственным ответом). – mafso

1

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

2

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

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

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

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled]; 

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

UIControlStateNormal 
UIControlStateHighlighted 
UIControlStateDisabled 
UIControlStateSelected 
1

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

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

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

Это можно изменить таким образом, или идти на раскадровку и изменить фон на параметры в правой стороне.

0

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) 
+0

Это был бы гораздо более полезный ответ, если бы вы сказали, как вызывать или использовать код, который вы там разместили. Он входит в расширение UIButton? –

+0

@MichaelDautermann добавил пример использования – pawurb

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