设置一次后如何消除UIButton的渐变效果-iPhone

设置一次后如何消除UIButton的渐变效果-iPhone,iphone,ios,uibutton,gradient,quartz-core,Iphone,Ios,Uibutton,Gradient,Quartz Core,我使用UIButton作为软键项。所以当我点击时,我想显示按钮的颜色效果。我使用下面的代码来做这件事 [btn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted]; CAGradientLayer *btnGradient = [CAGradientLayer layer]; btnGradient.frame = btn.bounds; btnGradient.color

我使用UIButton作为软键项。所以当我点击时,我想显示按钮的颜色效果。我使用下面的代码来做这件事

[btn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];

    CAGradientLayer *btnGradient = [CAGradientLayer layer];
    btnGradient.frame = btn.bounds;
    btnGradient.colors = [NSArray arrayWithObjects:
                          (id)[[UIColor colorWithRed:255.0f/255.0f green:255.0f/255.0f blue:255.0f/255.0f alpha:.6f] CGColor],
                          (id)[[UIColor colorWithRed:200.0f/255.0f green:200.0f/255.0f blue:200.0f/255.0f alpha:.4f] CGColor],
                          (id)[[UIColor colorWithRed:150.0f/255.0f green:150.0f/255.0f blue:150.0f/255.0f alpha:.4f] CGColor],
                          (id)[[UIColor colorWithRed:100.0f/255.0f green:100.0f/255.0f blue:100.0f/255.0f alpha:.4f] CGColor],
                          (id)[[UIColor colorWithRed:50.0f/255.0f green:50.0f/255.0f blue:50.0f/255.0f alpha:.4f] CGColor],
                          (id)[[UIColor colorWithRed:5.0f/255.0f green:5.0f/255.0f blue:5.0f/255.0f alpha:.4f] CGColor],

                          nil];
    [btn.layer insertSublayer:btnGradient atIndex:0];

    CAGradientLayer *glossLayer = [CAGradientLayer layer];
    glossLayer.frame = btn.bounds;
    glossLayer.colors = [NSArray arrayWithObjects:
                         (id)[UIColor colorWithWhite:1.0f alpha:0.4f].CGColor,
                         (id)[UIColor colorWithWhite:1.0f alpha:0.1f].CGColor,
                         (id)[UIColor colorWithWhite:0.75f alpha:0.0f].CGColor,
                         (id)[UIColor colorWithWhite:1.0f alpha:0.1f].CGColor,
                         nil];
    glossLayer.locations = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0f],
                            [NSNumber numberWithFloat:0.5f],
                            [NSNumber numberWithFloat:0.5f],
                            [NSNumber numberWithFloat:1.0f],
                            nil];
    [btn.layer insertSublayer:glossLayer atIndex:0];

    CALayer *btnLayer = [btn layer];
    [btnLayer setMasksToBounds:YES];

    UIColor*mycolor = btn.backgroundColor;
    [btn.layer setBorderColor:[mycolor CGColor]];  
尝试以下面的方式删除按钮的渐变效果。使阿尔法为零。。但是它不起作用

-(void) removeGradient:(UIButton *)btn{

    CAGradientLayer *btnGradient = [CAGradientLayer layer];
    btnGradient.frame = btn.bounds;
    btnGradient.colors = [NSArray arrayWithObjects:
                          (id)[[UIColor colorWithRed:255.0f/255.0f green:255.0f/255.0f blue:255.0f/255.0f alpha:.0f] CGColor],
                          (id)[[UIColor colorWithRed:200.0f/255.0f green:200.0f/255.0f blue:200.0f/255.0f alpha:.0f] CGColor],
                          (id)[[UIColor colorWithRed:150.0f/255.0f green:150.0f/255.0f blue:150.0f/255.0f alpha:.0f] CGColor],
                          (id)[[UIColor colorWithRed:100.0f/255.0f green:100.0f/255.0f blue:100.0f/255.0f alpha:.0f] CGColor],
                          (id)[[UIColor colorWithRed:50.0f/255.0f green:50.0f/255.0f blue:50.0f/255.0f alpha:.0f] CGColor],
                          (id)[[UIColor colorWithRed:5.0f/255.0f green:5.0f/255.0f blue:5.0f/255.0f alpha:.0f] CGColor],


                          nil];
    [btn.layer insertSublayer:btnGradient atIndex:0];

    CAGradientLayer *glossLayer = [CAGradientLayer layer];
    glossLayer.frame = btn.bounds;
    glossLayer.colors = [NSArray arrayWithObjects:
                         (id)[UIColor colorWithWhite:1.0f alpha:0.0f].CGColor,
                         (id)[UIColor colorWithWhite:1.0f alpha:0.0f].CGColor,
                         (id)[UIColor colorWithWhite:0.75f alpha:0.0f].CGColor,
                         (id)[UIColor colorWithWhite:1.0f alpha:0.0f].CGColor,
                         nil];
    glossLayer.locations = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0f],
                            [NSNumber numberWithFloat:0.5f],
                            [NSNumber numberWithFloat:0.5f],
                            [NSNumber numberWithFloat:1.0f],
                            nil];
    //[btn.layer insertSublayer:glossLayer atIndex:0];

    CALayer *btnLayer = [btn layer];
    [btnLayer setMasksToBounds:YES];

}
在这里,如果我点击一次,它工作正常。但如果我反复点击按钮,那么颜色会重新应用到按钮上,大约点击10次后,按钮会完全变成白色

我认为如果我们必须重做这个效果的话,我们必须移除层的先前梯度效果。 设置一次后如何消除图层上的渐变效果

谢谢
Jithen

您所要求的是非常常见的,可以通过对UIButton进行子类化轻松实现。创建子类后,将UIResponder touchEvents添加到子类中。在UIButton子类中,设置渐变的ivar,并在“开始触摸”和“结束触摸”中,更改渐变的属性。因此,在触摸开始时,可以将其反转,在触摸结束时,可以将其设置回原始渐变

  • 子类UIButton
  • 为CAGradient创建ivar
  • UIButton子类的initWithFrame方法中的设置梯度
  • 添加UIResponder触控偶数方法
  • 在ToucheSStart中-根据需要修改渐变
  • 在touchesEnded中重复步骤5
  • 我再次建议子类化,因为您需要捕获按钮的触摸事件。不能在已设置按钮的主视图控制器中执行此操作

    让我知道这是否有帮助

    编辑#1-看看下面的示例:

    -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
        gradient.colors = [NSArray arrayWithObjects:(id)[UIColor colorWithWhite:0.0f alpha:0.25f].CGColor,
                                                    (id)[UIColor colorWithWhite:0.0f alpha:0.25f].CGColor,
                                                    nil];
        gradient.locations = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0f],
                                                        [NSNumber numberWithFloat:0.75f],
                                                        nil];
    }
    
    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
        gradient.colors = [NSArray arrayWithObjects:(id)[UIColor colorWithWhite:1.0f alpha:0.25f].CGColor,
                                                    (id)[UIColor colorWithWhite:0.0f alpha:0.25f].CGColor,
                                                    nil];
        gradient.locations = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0f],
                                                        [NSNumber numberWithFloat:0.75f],
                                                        nil];
    }
    
    如果您注意到我正在修改现有的渐变。我不是每次都创造一个新的。我的值对你不起作用,但它的概念是不在每次点击时创建新的渐变。我只是在修改渐变属性

    编辑#2-为渐变创建ivar:

    -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
        gradient.colors = [NSArray arrayWithObjects:(id)[UIColor colorWithWhite:0.0f alpha:0.25f].CGColor,
                                                    (id)[UIColor colorWithWhite:0.0f alpha:0.25f].CGColor,
                                                    nil];
        gradient.locations = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0f],
                                                        [NSNumber numberWithFloat:0.75f],
                                                        nil];
    }
    
    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
        gradient.colors = [NSArray arrayWithObjects:(id)[UIColor colorWithWhite:1.0f alpha:0.25f].CGColor,
                                                    (id)[UIColor colorWithWhite:0.0f alpha:0.25f].CGColor,
                                                    nil];
        gradient.locations = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0f],
                                                        [NSNumber numberWithFloat:0.75f],
                                                        nil];
    }
    
  • 转到UIButton子类标题
  • 在“接口”部分下添加以下内容:

    CAGradientLayer*btnGradient

    CAGradientLayer*GLOSSLEAYER


  • 谢谢我也在做同样的事。。但是我不知道如何把按钮恢复到原来的颜色。。。我的意思是如何反转渐变颜色?只需将渐变颜色的alpha值更改为0即可。这将消除梯度。我也不确定你是否正确安装了它。你在上面的帖子中说梯度被一次又一次地重新应用。就像我说的,你应该用你想要的颜色初始化它,然后在触摸事件中,根据你的意愿修改渐变。。。编辑了我的帖子。。即使将alpha设置为0,我的按钮也不会恢复到原来的颜色。。。它在多次点击后变成白色…好的,我看到了代码。但是你要做的是在每个水龙头上加一个梯度。我说过你应该为你正在制作的两个渐变创建一个ivar。从那里,您可以修改触摸事件中的渐变。按照你的设置方式,你每次都在添加一个新的渐变。哦。。我是这方面的新手。。你能指导我如何创建ivar吗?或任何物品?使两个按钮隐藏一个按钮,然后将隐藏的按钮复制到您的按钮;)这不是一个解决方案。正确的方法是对触摸事件进行子类化和响应。在触摸事件中,渐变可以很容易地修改。这是将UIButton子类化的常见原因。