我从教程中找到了这段代码并尝试使用它:
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,并在界面构建器
中连接我可以对按钮进行其他自定义,例如更改其背景颜色(纯色)和更改文本颜色。但是当我尝试使用渐变色时,背景只是透明的。
感谢您的帮助!
答案 0 :(得分:2)
您需要设置渐变图层的框架以覆盖整个按钮。很有可能在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...
来检测按钮框架中的更改,并相应地调整图层大小。不是一个非常可重复使用的解决方案。
答案 1 :(得分:1)
我遇到了这个问题,即没有出现渐变。就像@khanhnguyen所说的那样,问题是我在viewDidLoad中设置了它,因为该按钮的边界是未知的,所以什么也没有出现。
当我将代码移至viewDidLayoutSubviews
时,它出现了。这是Swift中的答案:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let purpleColor = UIColor(red: 129/255, green: 52/255, blue: 175/255, alpha: 1)
let pinkColor = UIColor(red: 221/255, green: 42/255, blue: 123/255, alpha: 1)
let yellowColor = UIColor(red: 254/255, green: 218/255, blue: 119/255, alpha: 1)
let gradientLayer = CAGradientLayer()
gradientLayer.frame = yourButton.bounds
gradientLayer.colors = [purpleColor.cgColor, pinkColor.cgColor, yellowColor.cgColor]
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0)
gradientLayer.endPoint = CGPoint(x: 0.0, y: 1.0)
yourButton.layer.insertSublayer(gradientLayer, at: 0)
}
如果使用集合视图单元格,请将其添加到:
override func layoutSubviews() {
super.layoutSubviews()
}
答案 2 :(得分:0)
可能首先需要设置框架按钮。试试这个。
+ (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];
}