2010-10-26 71 views
26

嗨我想更改用户点击按钮上的UIButton背景颜色。突出显示时更改UIButton的背景颜色

我使用渐变显示背景颜色,当用户点击我需要更改渐变颜色。

[btn setTitle: @"Next" forState:UIControlStateNormal]; 
CAGradientLayer *gradient = [CAGradientLayer layer];    
gradient.frame = btn.bounds; 
gradient.cornerRadius = 10.0f; 
locations = [[NSArray alloc] initWithObjects: 0.0f, 0.0f, 0.0f,0.0f, nil]; 
[gradient setLocations:locations]; 
colorNext = [[NSArray alloc] initWithObjects:…., nil]; 
gradient.colors = colorNext; 
[locations release]; 
[btn.layer insertSublayer:gradient atIndex:0]; 
btn.titleLabel.textColor = [UIColor blackColor]; 
+0

有这个问题的好答案:http://stackoverflow.com/questions/14523348 /如何改变uibutton的background-color-of-uibutton-while-highlight- – ThomasW 2016-02-03 02:44:45

回答

36

不推荐更改UIButton的内部层次结构,因为它可能会在未来的iOS更新中破坏。另外,它可能会导致Apple拒绝您的应用程序。更好的解决方案是创建一个按钮子类。这里是如何做到这一点的例子:

@interface MyButton : UIButton 
@end 

@implementation MyButton 

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     [self addObserver:self forKeyPath:@"highlighted" options:NSKeyValueObservingOptionNew context:NULL]; 
    } 

    return self; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    [self setNeedsDisplay]; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; 

    if (self.highlighted == YES) 
    { 
     CGContextRef ctx = UIGraphicsGetCurrentContext(); 

     CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB(); 

     const CGFloat *topGradientColorComponents = CGColorGetComponents([UIColor whiteColor].CGColor); 
     const CGFloat *bottomGradientColorComponents = CGColorGetComponents([UIColor blackColor].CGColor); 

     CGFloat colors[] = 
     { 
      topGradientColorComponents[0], topGradientColorComponents[1], topGradientColorComponents[2], topGradientColorComponents[3], 
      bottomGradientColorComponents[0], bottomGradientColorComponents[1], bottomGradientColorComponents[2], bottomGradientColorComponents[3] 
     }; 
     CGGradientRef gradient = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors)/(sizeof(colors[0]) * 4)); 
     CGColorSpaceRelease(rgb); 

     CGContextDrawLinearGradient(ctx, gradient, CGPointMake(0, 0), CGPointMake(0, self.bounds.size.height), 0); 
     CGGradientRelease(gradient); 
    } 
    else 
    { 
     // Do custom drawing for normal state 
    } 
} 

- (void)dealloc 
{ 
    [self removeObserver:self forKeyPath:@"highlighted"]; 

    [super dealloc]; 
} 

@end 

您可能需要稍作修改,以得到它做你想要什么,但我想你的基本理念。

+0

可以告诉我需要在“//为高亮显示的状态进行自定义绘制”是否与我之前做的一样 – iPhoneDev 2010-10-26 13:07:20

+0

我已经添加了一个关于如何绘制渐变的示例。如果你想做其他自定义绘图,你应该看看Quartz 2D Programming Guide。 – loomer 2010-10-26 13:28:29

+0

非常感谢我会试试:) – iPhoneDev 2010-10-26 15:44:12

5

我发现这个AYUIButton在GitHub上和它完美的作品:) 下面是示例代码:

[btn setBackgroundColor:[UIColor redColor] forState:UIControlStateNormal]; 
[btn setBackgroundColor:[UIColor blueColor] forState:UIControlStateHighlighted]; 
31

试试这个:

[Button addTarget:self action:@selector(doSomething:) forControlEvents:UIControlEventTouchUpInside]; 
[Button addTarget:self action:@selector(setBgColorForButton:) forControlEvents:UIControlEventTouchDown]; 
[Button addTarget:self action:@selector(clearBgColorForButton:) forControlEvents:UIControlEventTouchDragExit]; 

-(void)setBgColorForButton:(UIButton*)sender 
{ 
    [sender setBackgroundColor:[UIColor blackColor]]; 
} 

-(void)clearBgColorForButton:(UIButton*)sender 
{ 
    [sender setBackgroundColor:[UIColor redColor]]; 
} 

-(void)doSomething:(UIButton*)sender 
{ 
double delayInSeconds = 0.3; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [sender setBackgroundColor:[UIColor redColor]]; 
    }); 
    //do something 

} 
+0

谢谢!为我工作,不需要继承按钮。好想法! – 2013-04-15 13:45:34

+0

=)很高兴你喜欢它! – henghonglee 2013-04-17 08:37:18

+1

实际上,有一个问题 - 当用户点击按钮并将其触摸移出时 - 按钮保持突出显示,但这可以通过事件DragExit轻松修复。 – 2013-04-19 07:05:58

2

当您设置按钮的TintColor它工作时突出显示

[YourButton setTintColor:[UIColor color]]; 
+0

它不工作。 – Vidhi 2014-10-16 07:58:35

+0

你需要做什么和你的问题是什么?如果您需要帮助,请发布一些代码@Vidhi您是否检查了其他答案? – Pach 2014-10-17 09:32:10

+1

我想在点击/突出显示时更改'UIButton'的背景颜色。我试过你的代码,但它没有改变背景颜色。因此,我结束了解决方案'[btnSubmit addTarget:self action:@selector(backgroundwhite :) forControlEvents:UIControlEventTouchDown]; (void)backgroundwhite:(id)sender { [sender setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [sender setBackgroundColor:[UIColor whiteColor]]; }' – Vidhi 2014-10-20 06:19:46

25

您可以使用此方法创建固体UII指定颜色的法师,然后将其应用于您的按钮。我已经为UIImage做了一个类别来做到这一点。

+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size 
{ 
    UIGraphicsBeginImageContext(size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetFillColorWithColor(context, color.CGColor); 
    CGContextFillRect(context, (CGRect){.size = size}); 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

+ (UIImage *)imageWithColor:(UIColor *)color 
{ 
    return [UIImage imageWithColor:color size:CGSizeMake(1, 1)]; 
} 

用法:

[button setBackgroundImage:[UIImage imageWithColor:[UIColor redColor]] 
        forState:UIControlStateNormal]; 

由于Matthias指出的那样,你可以安全地使用1x1图片为您的按钮背景 - 它会被拉伸,以填充按钮。

+3

感谢您的想法。不过,我用直接绘制上下文替换了UIView渲染。例如:'CGContextSetFillColorWithColor(context,color.CGColor); CGContextFillRect(context,CGRectMake(0,0,1,1));'(我用1,1作为尺寸,因为我创建了1x1图片,UIButton会拉伸图片。) – 2013-08-08 01:27:18

+0

是的,CGContextSetFillColorWithColor好多了! – 2013-08-30 13:45:43

+1

我已经更新了答案 – 2013-08-30 13:53:35

0

斯威夫特

扩展的UIButton,让你指定的背景颜色为每一个状态:

https://github.com/acani/UIButtonBackgroundColor

请注意,iPhone 6,再加上你应该改变以下,在延伸中。快速类,这将修复它的所有版本:

//let rect = CGRect(x: 0, y: 0, width: 0.5, height: 0.5) comment this line 
    let rect = CGRect(x: 0, y: 0, width: 1, height: 1) 
相关问题