【问题标题】:How to remove gradient effect for UIButton after setting once - iPhone设置一次后如何去除 UIButton 的渐变效果 - iPhone
【发布时间】:2013-05-15 03:14:15
【问题描述】:

我使用 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]];  

尝试通过以下方式移除按钮的渐变效果。使 alpha 为零..但它没有工作..

-(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 次点击后按钮完全变成白色。

如果我们必须重做效果,我认为我们必须删除图层的先前渐变效果。 设置一次后如何去除图层上的这种渐变效果。

谢谢 吉腾

【问题讨论】:

  • 隐藏一个按钮的两个按钮,然后将隐藏的按钮复制到您的按钮;)
  • Rajneesh071 这不是一个解决方案。正确的方法是子类化并响应触摸事件。在触摸事件中,可以很容易地修改渐变。这是继承 UIButton 的一个非常常见的原因。

标签: iphone ios uibutton gradient quartz-core


【解决方案1】:

您的问题很常见,可以通过继承 UIButton 轻松实现。创建子类后,将 UIResponder touchEvents 添加到子类中。在 UIButton 子类中,为渐变设置一个 ivar,并在开始触摸和结束触摸时,更改渐变的属性。因此,在触摸开始时您可以反转它,在触摸结束时您可以将其设置回原始渐变。

  1. 子类 UIButton
  2. 为 CAGradient 创建 ivar
  3. 在 UIButton 子类的 initWithFrame 方法中设置渐变
  4. 添加 UIResponder 触摸偶数方法
  5. 在 touchesBegan 中 - 根据需要修改渐变。
  6. 在 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:

  1. 转到 UIButton 子类标题
  2. 在界面部分下添加:

    CAGradientLayer *btnGradient;

    CAGradientLayer *glossLayer;

【讨论】:

  • 谢谢。我也在做同样的事情..但我不知道如何在触摸结束时将按钮变为原始颜色...我的意思是如何反转渐变颜色?
  • 只需将渐变颜色的 alpha 值更改为 0。这将删除渐变。另外我不确定您是否正确设置了它。您在上面的帖子中说过,渐变被一遍又一遍地重新应用。就像我说的,你应该用你想要的颜色初始化它,然后在触摸事件中,根据需要修改渐变。
  • 我已经将我的代码粘贴到我的帖子的最后...编辑了我的帖子..即使将 alpha 设置为 0,我的按钮也没有恢复到原来的颜色...之后它变成白色很多点击..
  • 好的,我看到代码了。但是你正在做的是在每次点击时添加一个渐变。我说过你应该为你正在制作的两个渐变创建一个 ivar。从那里您可以修改触摸事件中的渐变。您设置它的方式每次都添加一个新的渐变。
  • 哦..我是这方面的新手..你能指导我如何创建 ivar 吗?或者任何文章?
猜你喜欢
  • 1970-01-01
  • 2018-08-18
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 2019-03-01
相关资源
最近更新 更多