微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 从TableViewCell中删除imageView子图层

我有一个图像时,我插入了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)

解决方法

抛出异常是因为您在使用foreach循环枚举子层数组时更改子层数组的内容.这对于图层来说不是特别的,当您在枚举任何NSMutableArray时添加/删除对象时会抛出类似的异常.

您有多种方法可以解决此问题

解决方案1:修改数组后立即停止枚举.

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"];

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐