UIButton渐变不起作用

时间:2013-07-04 20:10:54

标签: iphone ios objective-c cocoa 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,并在界面构建器

中连接

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

感谢您的帮助!

3 个答案:

答案 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];
}