Подтвердить что ты не робот

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

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

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

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

Ответ 1

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

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>

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 8

Хорошо, я на 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];

Ответ 9

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

}

Ответ 10

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

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

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

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

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

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected

Ответ 11

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

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

Ответ 15

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

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

Ответ 16

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