UIButton渐变不起作用

我从教程中找到了这段代码并尝试使用它:

CAGradientLayer *btnGradient = [CAGradientLayer layer]; btnGradient.frame = button.bounds; btnGradient.colors = [NSArray arrayWithObjects: (id)[[UIColor colorWithRed:102.0f / 255.0f green:102.0f / 255.0f blue:102.0f / 255.0f alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:51.0f / 255.0f green:51.0f / 255.0f blue:51.0f / 255.0f alpha:1.0f] CGColor], nil]; [button.layer insertSublayer:btnGradient atIndex:0]; 

代码在viewDidLoad方法中。

按钮在.h文件中定义如下: @property (nonatomic, strong) IBOutlet UIButton *button;

它在.m文件中的@synthesized,它在界面构建器中连接

我可以对按钮进行其他自定义,例如更改其背景颜色(纯色)和更改文本颜色。 但是当我尝试使用渐变色时,背景就是透明的。

我感谢您的帮助!

可能首先需要设置框架按钮。 尝试这个。

 + (UIButton*) buttonWithGradient:(CGSize)size beginColor:(UIColor*)beginColor endColor:(UIColor*)endColor { CGRect frame = { CGPointZero, size }; UIButton* button = [[UIButton alloc] initWithFrame:frame]; CAGradientLayer* gradient = [CAGradientLayer layer]; gradient.frame = frame; gradient.colors = @[(id)beginColor.CGColor, (id)endColor.CGColor]; [button.layer insertSublayer:gradient atIndex:0]; return [button autorelease]; } 

您需要设置渐变图层的框架以覆盖整个按钮。 很可能在viewDidLoad ,按钮的大小为零,这使得渐变图层的框架为零……以及稍后当按钮的大小发生变化时,渐变图层的框架不会相应地更改。

UIButton子类化并覆盖layoutSubviews是一个好主意

 @interface MyButton : UIButton { } @implementation MyButton { CAGradientLayer* _gradient; } -(id)init { self = [super init]; _gradient = [CAGradientLayer layer]; _gradient.colors = [NSArray arrayWithObjects: (id)[[UIColor colorWithRed:102.0f / 255.0f green:102.0f / 255.0f blue:102.0f / 255.0f alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:51.0f / 255.0f green:51.0f / 255.0f blue:51.0f / 255.0f alpha:1.0f] CGColor], nil]; [self.layer insertSublayer:_gradient atIndex:0]; } -(void)layoutSubviews { [super layoutSubviews]; _gradient.frame = self.bounds; } @end 

另一种选择是使用observeValueForKeyPath...来检测按钮框架中的更改,并相应地调整图层的大小。 不是一个非常可重复使用的解决方案。