禁用按钮时更改或删除我的 CAGradientLayer

Posted

技术标签:

【中文标题】禁用按钮时更改或删除我的 CAGradientLayer【英文标题】:change or remove my CAGradientLayer when button is disabled 【发布时间】:2014-07-15 23:29:13 【问题描述】:

我使用 CAGradientLayer 作为按钮的背景。

cell.showOnMap.clipsToBounds = YES;
cell.showOnMap.layer.cornerRadius = 10.0f;
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.showOnMap.frame.size.width, cell.showOnMap.frame.size.height)];
CAGradientLayer *gradient2 = [CAGradientLayer layer];
gradient2.frame = view2.bounds;
gradient2.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:0.00 green:0.66 blue:0.71 alpha:1.0]  CGColor], (id)[[UIColor colorWithRed:0.18 green:0.27 blue:0.75 alpha:1.0] CGColor], nil];
[cell.showOnMap.layer insertSublayer:gradient2 atIndex:0];
[cell.showOnMap bringSubviewToFront:cell.showOnMap.imageView];

在某些情况下,我的按钮 showOnMap 将被禁用。在这种情况下,我希望 CAGradient 层从 lightGrayColor 更改为 grayColor 或完全删除该层。这是启用/禁用代码。

if(entry.address == nil)
   [cell.showOnMap setEnabled:NO];
    cell.showOnMap.layer.sublayers = nil;

else
    [cell.showOnMap setEnabled:YES];

到目前为止,我已经尝试将整个渐变代码放在 else 部分中,然后将相同的代码放在 if(entry.address == nil) 中,但使用灰色作为渐变。这没有用;该按钮始终是最初的蓝色渐变。

我也尝试过cell.showOnMap.layer.sublayers = nil;,但这会删除我拥有的文本和按钮图像,只留下带有圆边的背景。

[[cell.showOnMap.layer.sublayers objectAtIndex:0] removeFromSuperlayer]; 没有产生任何变化,[[cell.showOnMap.layer.sublayers objectAtIndex:0] removeFromSuperview]; 导致崩溃

当我的按钮被禁用时,如何引用我的 CAgradient 图层并将其移除?

【问题讨论】:

【参考方案1】:

在您的单元格内创建一个gradientLayer 属性。然后将你的 gradientLayer 初始化到这个属性。然后您可以稍后安全地引用它来修改它或removeFromSuperlayer

【讨论】:

我将文本更改为:UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.showOnMap.frame.size.width, cell.showOnMap.frame.size.height)]; cell.gradientBackground.frame = view2.bounds; cell.gradientBackground.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:0.00 green:0.66 blue:0.71 alpha:1.0] CGColor], (id)[[UIColor colorWithRed:0.18 green:0.27 blue:0.75 alpha:1.0] CGColor], nil]; [cell.showOnMap.layer insertSublayer:cell.gradientBackground atIndex:0]; 并引用了单元格子类中的属性,但现在渐变不显示 有什么建议吗?我需要在方法中再次将其声明为 CAGradientLayer 吗? 您需要像这样将渐变初始化到属性中:cell.gradientBackground = [CAGradientLayer layer]。还要确保该属性是强的(默认)。 哦!意外删除了那条线。所以在我禁用单元格的方法中,我写了[cell.gradientBackground removeFromSuperlayer];,这似乎也不起作用...... 我也尝试将不透明度设置为 0.0,但这没有用。这个方法在cellForRowAtIndexPath

以上是关于禁用按钮时更改或删除我的 CAGradientLayer的主要内容,如果未能解决你的问题,请参考以下文章

colorbox:如何禁用下一个和上一个按钮

Kendo UI Scheduler 禁用删除确认或更改其内容

在 TextFormField Flutter 的值更改时禁用 AlertDialog 按钮

使用 JQuery 或 codeigniter 单击按钮时如何更改数据库表的值(设置为默认 false 的布尔列)

当textfield为空时禁用按钮等待其他文本字段中的任何更改

如何在文本更改时启用/禁用绑定到 ICommand 的按钮,而不是失去 TextBox 的焦点