ImageView 上的渐变层重用
Posted
技术标签:
【中文标题】ImageView 上的渐变层重用【英文标题】:Gradient Layer over ImageView reuse 【发布时间】:2015-10-19 12:26:47 【问题描述】:在我的“cellForRowAtIndexPath”中,我有以下代码来填充图像(异步)并应用自定义渐变
这很好,直到我为每个单元格添加了自定义颜色。它目前正在做的是回收以前的颜色而不是应用新颜色 - 这可能是由于以下行将跳过应用于每个单元格的渐变代码:
if(!cell.gradientMask)
但是,如果我将其注释掉,颜色会起作用,但每个单元格上的渐变会随着每次添加新图层而叠加(请参阅existing issue)
我认为我需要在每次迭代时删除 gradientLayer,这是最好的方法还是我需要子类化 UIImageView?
if (!cell.gradientMask)
gradientMask = [CAGradientLayer layer];
gradientMask.frame = cell.eventImage.layer.bounds;
gradientMask.startPoint = CGPointMake(0.5, 0.2);
gradientMask.endPoint = CGPointMake(0.5, 1.0);
/* THIS COLOUR CHANGES FOR EACH CELL */
gradientMask.colors = [NSArray arrayWithObjects:
(id)[[UIColor colorWithRed:0.0f green:0.0f blue:1.0f alpha:0.0f] CGColor],
(id)[[UIColor colorWithRed:0.0f green:0.0f blue:1.0f alpha:1.0f] CGColor],nil];
[cell.eventImage.layer insertSublayer:gradientMask atIndex:0];
cell.gradientMask = gradientMask;
【问题讨论】:
您是否尝试在继续之前删除图层? 【参考方案1】:您需要在创建渐变蒙版的块之外设置颜色:
if (!cell.gradientMask) //Operations that need to be carried out only ONCE are put inside this block
gradientMask = [CAGradientLayer layer];
gradientMask.frame = cell.eventImage.layer.bounds;
gradientMask.startPoint = CGPointMake(0.5, 0.2);
gradientMask.endPoint = CGPointMake(0.5, 1.0);
[cell.eventImage.layer insertSublayer:gradientMask atIndex:0];
cell.gradientMask = gradientMask;
//Operations that need to be carried out again and again are outside the block
if (condition1)
cell.gradientMask.colors = [NSArray arrayWithObjects:
(id)[[UIColor colorWithRed:0.0f green:0.0f blue:1.0f alpha:0.0f] CGColor],
(id)[[UIColor colorWithRed:0.0f green:0.0f blue:1.0f alpha:1.0f] CGColor],nil];
else
cell.gradientMask.colors = [NSArray arrayWithObjects:
(id)[[UIColor colorWithRed:0.0f green:1.0f blue:0.0f alpha:0.0f] CGColor],
(id)[[UIColor colorWithRed:0.0f green:1.0f blue:0.0f alpha:1.0f] CGColor],nil];
【讨论】:
以上是关于ImageView 上的渐变层重用的主要内容,如果未能解决你的问题,请参考以下文章
UIImageview 上的渐变层在 iphone 6s 中向上移动,同时在 iphone 5 中正确设置