[英]Remove imageView sublayer from TableViewCell
當我有圖像時,我插入帶有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的同時添加/刪除對象時會引發類似的異常。
您有多種選擇來解決此問題
解決方案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"];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.