Как установить цвет фона кнопки на iPhone? - PullRequest
37 голосов
/ 17 декабря 2008

Как мне установить собственный цвет фона кнопки?

Интерфейсный Разработчик, похоже, не имеет интерфейса для этого.

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

Ответы [ 19 ]

1 голос
/ 23 декабря 2010

я сделал это следующим образом, чтобы создать кнопку, подобную кнопке удаления системы, как в uitableview


UIButton *h=[[UIButton  alloc]init];
[[h layer] setCornerRadius:8.0f];
[[h layer] setMasksToBounds:YES];
[[h layer] setBorderWidth:1.0f];
CAGradientLayer *gradientLayer = [[CAGradientLayer alloc] init];
[gradientLayer setBounds:[h bounds]];
[gradientLayer setPosition:CGPointMake([h bounds].size.width/2, [h bounds].size.height/2)];
[gradientLayer setColors:[NSArray arrayWithObjects:
(id)[[UIColor darkGrayColor]CGColor],(id)[[UIColor blackColor] CGColor], nil]];
[[h layer] insertSublayer:gradientLayer atIndex:0];

освободить все объекты и импортировать QuartzCore / QuartzCore.h и добавьте этот фреймворк в ваш проект.

1 голос
/ 15 декабря 2010

Вот бесплатное приложение, которое я создал, которое создает изображения UIGlassButton. Установите тип кнопки на пользовательский. http://itunes.apple.com/us/app/uibutton-builder/id408204223?mt=8

1 голос
/ 19 августа 2010

Решение Тима Джеймса (сегментированный элемент управления с одним сегментом) работало для меня, когда я хотел простую кнопку «Сохранить» с приличным синим градиентным фоном. Я просто создал 2-сегментный элемент управления в кончике, настроил первый сегмент так, как хотел, а затем программно удалил второй сегмент в -viewWillAppear, используя [mySegmentedControl removeSegmentAtIndex: 1 animated: NO]. Для моих целей «Мгновенный» должен был быть активным (отмечен галочкой) для первого сегмента сегментированного элемента управления в кончике, а «Выбранный» не был активен ни для одного сегмента. «Значение изменено» - это действие сегментированного элемента управления для подключения.

1 голос
/ 16 апреля 2009

Я решил эту проблему, создав собственную кнопку в Fireworks. Я нарисовал прямоугольник со скругленными углами примерно того размера, который мне нужен, с цветом заливки и цветом рамки, которые я хотел. Обрежьте холст и сохраните как PNG. В XCode добавьте файл в папку «Ресурсы». Вы можете использовать кнопку Custom в Интерфейсном Разработчике и указать изображение в качестве этого PNG. Он изменит размер по мере необходимости, поместит текст сверху и т. Д. Кривая углов может исказиться, если вам придется значительно изменить размер оригинала.

0 голосов
/ 13 января 2009

Керемк был прав, когда сказал изменить цвет фона «Вид», когда вы нажали кнопку и вошли в инспектор. Это меняет маленькие углы на любой выбранный вами цвет.

0 голосов
/ 23 ноября 2011

colored UIButton

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

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

#import <QuartzCore/QuartzCore.h>

colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;
0 голосов
/ 08 июля 2013

Построение дальше @ Denny1989 Я решил проблему с получением ошибок (недопустимый контекст 0x0) при настройке кнопки в viewDidLoad. Кнопка должна быть развернута до того, как она будет иметь размер и, следовательно, не может зависеть до тех пор, пока не появится вид. Эта категория добавляет цвет для UIControlStateNormal. Если для вашего приложения необходимы другие состояния управления, вам необходимо добавить их аналогично категории.

//  UIButton+ColoredBackground.h

#import <UIKit/UIKit.h>

@interface UIButton (ColoredBackground)

@property (nonatomic, retain) UIColor *buttonColorNormal;

@property (nonatomic, retain) NSNumber *madeBackgroundImages;

- (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state;

- (void)drawRect:(CGRect)rect;

- (void)awakeFromNib;

@end

и

//  UIButton+ColoredBackground.m

#import "UIButton+ColoredBackground.h"
#import <QuartzCore/QuartzCore.h>
#import <objc/runtime.h>

#define kCornerRadius 8.0f
#define kStrokeColor [UIColor darkGrayColor]
#define kStrokeWidth 1.0f



@implementation UIButton (ColoredBackground)

static char UIB_ButtonColorNormal_KEY;
static char UIB_MadeBackgroundImages_KEY;

@dynamic buttonColorNormal;

-(void)setButtonColorNormal:(NSObject *)buttonColorNormal
{
    objc_setAssociatedObject(self, &UIB_ButtonColorNormal_KEY, buttonColorNormal, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(NSObject*)buttonColorNormal
{
    return (NSObject*)objc_getAssociatedObject(self, &UIB_ButtonColorNormal_KEY);
}

@dynamic madeBackgroundImages;

-(void)setMadeBackgroundImages:(NSObject *)madeBackgroundImages
{
    objc_setAssociatedObject(self, &UIB_MadeBackgroundImages_KEY, madeBackgroundImages, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(NSObject*)madeBackgroundImages
{
    return (NSObject*)objc_getAssociatedObject(self, &UIB_MadeBackgroundImages_KEY);
}
- (void)awakeFromNib {
    [self setMadeBackgroundImages:[NSNumber numberWithBool:FALSE]];
    [super awakeFromNib];
}

- (void)drawRect:(CGRect)rect {
    // if background images were not created from color do so here
    // if self.buttonColorNormal is not set behaves like normal button
    if ((self.buttonColorNormal)&&(![[self madeBackgroundImages] boolValue])) {
        [self setBackgroundColor:[self buttonColorNormal] forState:UIControlStateNormal];
        [self setMadeBackgroundImages:[NSNumber numberWithBool:TRUE]];
    }
    [super drawRect:rect];
}

- (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state {

    gcSize = CGSizeMake(2*kCornerRadius +1, self.bounds.size.height);
    UIGraphicsBeginImageContext(gcSize);

    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();

    UIColor *gradientStart = [UIColor colorWithRed:0.80 green:0.80 blue:0.80 alpha:0.2];
    UIColor * gradientEnd = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    NSArray *colors = [NSArray arrayWithObjects:(id)gradientStart.CGColor, (id)gradientEnd.CGColor, nil];
    CGFloat locations[2] = { 0.0f, 1.0f };
    CGGradientRef _gradient = CGGradientCreateWithColors(rgb, (__bridge CFArrayRef)colors, locations);
    CGColorSpaceRelease(rgb);
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeOverlay);
    CGContextDrawLinearGradient(UIGraphicsGetCurrentContext(), _gradient, CGPointMake(0.0, kStrokeWidth), CGPointMake(0.0, self.bounds.size.height-kStrokeWidth), 0);

    UIBezierPath *outsideEdge = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0.0, 0.0, gcSize.width, gcSize.height) cornerRadius:kCornerRadius];
    [backgroundColor setFill];
    [kStrokeColor setStroke];
    outsideEdge.lineWidth = kStrokeWidth;
    [outsideEdge stroke];
    [outsideEdge fill];
    CFRelease(_gradient);

    // Create the background image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Set image as button's background image (stretchable) for the given state
    [self setBackgroundImage:[image stretchableImageWithLeftCapWidth:kCornerRadius topCapHeight:0.0] forState:state];

    // Ensure rounded button
    self.clipsToBounds = YES;
    self.layer.cornerRadius = kCornerRadius;

    // add colored border
    self.layer.borderColor = kStrokeColor.CGColor;
    self.layer.borderWidth = kStrokeWidth;
}

@end

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

- (void)viewDidLoad
{
        [myButton setButtonColorNormal:[UIColor redColor]];
}

Убедитесь, что тип кнопки настраивается, или drawRect может не вызываться.

0 голосов
/ 09 августа 2015

Итак, я нашел невероятно простое решение с использованием категорий. (Настолько просто, что мне кажется, что я что-то делаю, но я этого не вижу!)

Определите категорию (если вы не знаете, что это такое, в итоге: это способ минимального «расширения» класса, то есть добавления методов в класс, но без свойств) для UIButton, и создание метод "setBackgroundColor", который вызывает метод setBackgroundColor суперкласса UIButton (UIControl).

@implementation UIButton (coloredBackgroundButton)

-(void)setBackgroundColor:(UIColor *)backgroundColor {
    [super setBackgroundColor:backgroundColor];
}

Где бы вы не использовали кнопки UIB, если вы импортируете заголовочный файл, в котором объявлена ​​эта категория, в данном случае

#import "coloredBackgroundButton.h" 

Вы можете вызвать setBackgroundColor для них.

0 голосов
/ 17 декабря 2008

Может быть, я неправильно понял ваш вопрос, но у вас не работает ниже?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...