iOS 在带有图像的 UIButton 下设置 CAGradientLayer

标签 ios objective-c interface-builder

在我的 iOS 应用程序中我有一个问题,有一个带有图像的按钮,我想在图像下为按钮设置一个渐变,我写了这段代码:

- (void)viewDidLoad {
    [super viewDidLoad];

    CAGradientLayer *gradient = [GradientColor btnGreyGradient];
    [gradient setFrame:self.btnTicketView.layer.bounds];
    gradient.masksToBounds = YES;

   [self.btnTicketView.layer insertSublayer:gradient atIndex:0];
    self.btnTicketView.clipsToBounds = YES;
}

我的 GradientColor 类是:

 #import "GradientColor.h"

@implementation GradientColor


+(CAGradientLayer *)btnGreyGradient
{


    UIColor *startColor = [UIColor colorWithRed:169.0/255.0 green:169.0/255.0 blue:169.0/255.0 alpha:1.0];
    UIColor *endColor = [UIColor colorWithRed:128.0/255.0 green:128.0/255.0 blue:128.0/255.0 alpha:1.0];


    NSArray *arrayColors = [NSArray arrayWithObjects:(id) startColor.CGColor, endColor.CGColor, nil];


    CAGradientLayer *viewGradient = [CAGradientLayer layer];
viewGradient.colors = arrayColors;

    return viewGradient;

}

问题是当我为我的按钮设置渐变时,我在 InterfaceBuilder 中设置的图像被覆盖了。 我该如何解决这个问题?? 谢谢你

最佳答案

插入图层后将 imageView 置于顶部。

[self.btnTicketView.layer insertSublayer:gradient atIndex:0];
[self.btnTicketView bringSubviewToFront:self.btnTicketView.imageView];

编辑:

您可能想创建按钮的子类,以便可以重用,例如:

- (id)init
{
    self = [super init];
    if (self) {
        [self myInit];
    }
    return self;
}

 - (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self myInit];
    }
    return self;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self myInit];
    }
    return self;
}

- (void) myInit
{
    _gradientLayer = [[CAGradientLayer alloc] init];
    _gradientLayer.frame = self.layer.bounds;

    NSArray* locations = [NSArray arrayWithObjects:@0, @0.40, @0.60, @1, nil];

    [_gradientLayer setLocations:locations];

    [self.layer insertSublayer:_gradientLayer atIndex:0];

    [self bringSubviewToFront:self.imageView];

    NSArray* colors = [self getGradientColors];

    [_gradientLayer setColors:colors];
}

关于iOS 在带有图像的 UIButton 下设置 CAGradientLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36067877/

相关文章:

ios - 如何在 UIView 中使 SwiftUI View 透明或半透明?

objective-c - 如何在 iOS 上制作图像 "magnification"效果?

objective-c - 字符编码 CP037

ios - iOS xibs 的动画约束

ios - 无法插入新的 socket 连接 : Could not find any information for the class named

ios - IBInspectable UIView 属性

ios - 无法使用 CLI 构建 Cordova iOS 项目,但可以构建/运行 Xcode 项目

ios - AngularJS 数据绑定(bind)不适用于 iOS Safari 仅适用于 Heroku 应用程序

ios - 无法向服务 com.apple.WebKit.Networking 发送信号 : 113: Could not find specified service

ios - 自定义类 "Cannot find interface declaration"中无法识别 Objective-C 类别方法