簡體   English   中英

從TableViewCell移除imageView子圖層

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM