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...
来检测按钮框架中的更改,并相应地调整图层的大小。 不是一个非常可重复使用的解决方案。