Чи можна змінити колір тла UIButtons?


105

Цей мене наткнувся.

Чи взагалі можливо змінити колір тла UIButton в Какао для iPhone. Я спробував встановити колір тла, але він змінює лише кути. setBackgroundColor:здається, єдиний доступний метод для таких речей.

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

ви можете виправити зображення або видалити його? kthx;)
stigi

o-0 hmmmm ....., зображення було добре, але тепер воно більше не відображатиметься. Щойно видалили його
dubbeat


Я вирішую це питання у своєму попередньому дописі, будь ласка, перевірте посилання [Динамічно змінити межу або заднім числом UIButton] [1] [1]: stackoverflow.com/questions/9733213/…
IMMORTAL

хороший підручник та зразок коду знайдено тут cimgf.com/2010/01/28/…
Shamsudheen TK

Відповіді:


160

Це можна зробити програмно, зробивши репліку:

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>

редагувати: усім новим читачам слід також розглянути декілька доданих варіантів як "іншу можливість". для вас розгляд.

Оскільки це стара відповідь, я настійно рекомендую прочитати коментарі для усунення несправностей


Це те, що шукає ОП.
Стівен

4
солодкий! З усіх солей я знайшов це той, з яким я пішов. В якості уточнення, зробити "репліку" означає використання кварцу для малювання округлого прямокутника в спеціальній кнопці, а не використання кнопки типу RoundedRect. Спочатку я подумав, що це означає якось зробити дублікат округлої прямої форми з іншим кольором для імітації зміни кольору bg.
daver

1
Працював на відмінно, найкраща відповідь на ОП. Дякую, що поділились.
Брам

@daver: Ця відповідь настільки популярна, що, мабуть, заслуговує на мене. Як можна змінити колір тла відповідно до стану? Імовірно, потрібно явно змінювати колір фону щоразу, коли стан змінюється. Мою кнопку відключити при натисканні, доки веб-служба не відповість. Потрібно змінити, щоб виділити колір на натисканні та змінити таймер на відключений колір під час очікування відповіді? Якщо я пропускаю пункт, може хтось, будь ласка, пояснить Дякую Полі.
Поллі

1
@Polly: Вибачте, я не побачив ваш коментар раніше, але якщо вас все-таки цікавить ось що я закінчив: підклас UIButton і переопределити drawRect: намалювати округлу пряму за допомогою деяких UIBezierPaths. Після малювання заповніть його градієнтом за допомогою CGGradientCreateWithColorComponents (). Один з аргументів цієї функції - це масив поплавків з 4 елементами (що відповідає R, G, B і alfa). Я визначив 2 кольорових масиви, по одному для кожного стану, і обрав відповідний у drawRect на основі стану кнопки.
daver

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;
DefenestrationДень

Мені подобається це рішення, але на даний момент я не можу його використовувати. Я отримую помилку, оскільки "CommonUIUtility" неможливо знайти. Google просто дає мені речі затемнення, але я думаю, це має бути в QuartzCore? Якісь ідеї?
Стефан

Ні, це визначений користувачем клас для виконання загальних інтерфейсів інтерфейсу в додатку. Ви пишете метод imageFromColor у своєму власному класі.
Карим

1
Пахне як метод категорії на UIButton: setBackgroundColor:(UIColor *) forState:(UIControlState).
EthanB

3
Це настільки нерозумно, що ми на iOS 7, і це
НАЙДИ

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

Останній рядок показує, як встановити зображення для вибраного та виділеного стану (це один ІБ не можна встановити). Вибрані зображення вам не потрібні (рядки 4 та 6), якщо кнопка не потребує вибраного стану.


Дякую за пояснення. Просто швидке запитання. Якщо я перезаписую методом drawrect, я думаю, що це передбачає використання бібліотеки малюнків? Щось одне лише з рядків програмно накреслити округлий прямокутник і заповнити його кольором?
дуббет

2
Я щойно зробив короткий запит google для "iphone drawrect круглі кути" і виявив це: iphonedevelopment.blogspot.com/2008/11/… Перевірте метод drawrect на прикладі того, як намалювати круглу пряму. Ви можете використовувати CGContextSetFillColorWithColorта CGContextFillPathзаповнити прокладений шлях CGContextAddArcToPoint.
стигі

2
+50 для вказівки потенціалу бітмейкінгу для керуючих станів, тобто: forState:(UIControlStateHighlighted | UIControlStateSelected)Ура.
NSTJ

28

Інша можливість:

  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

Коли я додаю цей код, він показує закруглену пряму, але коли я натискаю на неї, кнопка не підкреслює виділення. Що відбувається?
Буде чи

Проблема такого підходу полягає в тому, що ви не можете встановити колір тла для виділеного стану кнопки.
ch3rryc0ke

17

Підклас UIBповторний і переосмислений набір Виділені та встановленіВибрані методи

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

кольоровий UIButton

Якщо ви не хочете використовувати зображення, і хочете, щоб вони виглядали точно як стиль «Закруглена прямота», спробуйте це. Просто розмістіть UIView над UIButton, з однаковим кадром та маскою автоматичного розміру, встановіть альфа на 0,3 та встановіть колір на колір. Потім за допомогою фрагмента нижче відріжте закруглені краї від кольорового виду накладки. Також зніміть прапорець "Взаємодія користувачів увімкнено" у IB на UIView, щоб події дотику каскадувалися до UIButton під ним.

Одним із побічних ефектів є те, що ваш текст також буде кольоровим.

#import <QuartzCore/QuartzCore.h>

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

7

Ще одна можливість (найкращий і найкрасивіший imho):

Створіть UISegmentedControl з 2 сегментами потрібного кольору фону в Interface Builder. Встановіть тип "бар". Потім змініть його на наявність лише одного сегмента. Конструктор інтерфейсів не приймає жодного сегмента, тому це потрібно робити програмно.

Тому створіть IBOutlet для цієї кнопки та додайте її до viewDidLoad вашого перегляду:

[segmentedButton removeSegmentAtIndex:1 animated:NO];

Тепер у вас є красива глянсова кольорова кнопка із заданим кольором фону. Для дій використовуйте подію "значення змінено".

(Я знайшов це на http://chris-software.com/index.php/2009/05/13/creating-a-nice-glass-buttons/ ). Дякую Кріс!


5

Я на 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];

5
Ви абсолютно праві. Це біль і те, що потрібно займати кілька хвилин замість клопоту створювати образи. Плюс якщо ваша кнопка кругла, це ще важче зробить ... Такий біль.
Henley Chiu

2

За пропозицією @EthanB і @karim створивши прямокутний заповнений прямокутник, я просто створив категорію для UIButton, щоб досягти цього.

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

Використання:

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

Необов’язково використовувати для держав:

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected

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

}

Блискучий !!!!!! Але не вдалося викликати кілька разів проти однієї кнопки. Можливо, але нові шари додаються знову і знову.
Валерій Ван

@StanJames: Правки до коду повинні бути запропоновані коментарем (або, якщо потрібно, власною відповіддю).
mafso

1

додайте другу ціль UIButtonдля UIControlEventTouchedі змініть UIButtonколір фону. Потім поверніть його в UIControlEventTouchUpInsideціль;


1

Для професійних і приємно виглядаючих кнопок ви можете перевірити цей спеціальний компонент кнопки . Ви можете використовувати його безпосередньо у своїх переглядах та переглядах таблиць або змінювати вихідний код, щоб він відповідав вашим потребам. Сподіваюся, це допомагає.


1

Це не так елегантно, як підкласифікація UIButton, однак, якщо ви просто хочете чогось швидкого - те, що я зробив, було створити власну кнопку, то зображення розміром 1 пікселя на 1 пікс із кольором, який я хотів би бути кнопкою, і встановити фон кнопки до цього зображення для виділеного стану - працює для моїх потреб.


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

Швидкий 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)

Це було б набагато кориснішою відповіддю, якби ви сказали, як викликати або використовувати код, який ви ввели. Це переходить у розширення UIButton?
Майкл Даутерманн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.