it-swarm.com.ru

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

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

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

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

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

    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>

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

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

158
Stian Storrvik

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

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

59
karim

Я предполагаю, что вы говорите о UIButton с 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), если вы нажимаете кнопку '' не нужно выбранного состояния.

32
stigi

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

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

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

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

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

28
wubbe

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

colored UIButton

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

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

#import <QuartzCore/QuartzCore.h>

colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;
7
Jacob Jennings

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

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

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

[segmentedButton removeSegmentAtIndex:1 animated:NO];

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

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

7
wubbe

Ну, я на 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
dubbeat

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

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

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

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

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

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected
2
zmonteca

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

}
2
gheese

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

1
Shaun

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

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

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

1
SMSidat

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

1
Ahmet Ardal

Свифт 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
pawurb

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

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

0
Vinicius Carvalho