1

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

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,它在界面生成器中连接

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

我感谢您的帮助!

4

3 回答 3

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

于 2013-07-05T00:15:20.830 回答
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()
}
于 2019-04-08T02:42:26.073 回答
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];
}
于 2013-07-04T20:27:15.817 回答