当我有图像时,我使用 CAGradientLayer 插入子图层,
...
layer.name = @"Gradient";
[cell.imageView.layer insertSublayer:layer atIndex:0];
当 ImageView 没有图像时,我需要删除这个子层。
我尝试了不同的方法但没有成功。我最后一次尝试的是
for (CALayer *layer in cell.imageView.layer.sublayers) {
if ([layer.name isEqualToString:@"Gradient"]) {
[layer removeFromSuperlayer];
}
}
但它给了我一个错误:
CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. *** Collection <CALayerArray: 0xc1502e0> was mutated while being enumerated. with userInfo (null)
抛出异常是因为您正在更改sublayers
数组,同时使用 foreach 循环枚举它。这对于层来说并不是什么特殊的事情,当您在枚举任何 NSMutableArray 时添加/删除对象时,会引发类似的异常。
您有多种选择来解决此问题
解决方案一:一旦修改数组就停止枚举。
for (CALayer *layer in cell.imageView.layer.sublayers) {
if ([layer.name isEqualToString:@"Gradient"]) {
[layer removeFromSuperlayer];
break;
}
}
解决方案2:不要枚举真正的数组,而是使用它的副本。
NSArray* sublayers = [NSArray arrayWithArray:cell.imageView.layer.sublayers];
for (CALayer *layer in sublayers) {
if ([layer.name isEqualToString:@"Gradient"]) {
[layer removeFromSuperlayer];
}
}
解决方案3:使用键值编码来保留对梯度层的引用。
插入后设置:
[cell.imageView.layer insertSublayer:layer atIndex:0];
[cell.imageView.layer setValue:layer forKey:@"GradientLayer"];
检索并删除它
CALayer* layer = [cell.imageView.layer valueForKey:@"GradientLayer"];
[layer removeFromSuperlayer];
[cell.imageView.layer setValue:nil forKey:@"GradientLayer"];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)