清除 CALayer

5
我使用 CALayerCATextLayers 在 iPhone 上的数独网格上布置数字。
我有一个表视图列出了一些数独。当我点击其中一个表单元格时,它会显示在另一个视图控制器中,该控制器被推到导航控制器上。
在我的 - (void)viewWillAppear 方法中,我调用我的 - (void)loadSudoku 方法,我将向您展示下面的方法。
问题是当您查看一个数独,然后使用导航栏中的“返回”按钮返回到表视图,然后再点击另一个数独时,旧的数独仍然存在,并且新的数独绘制在旧的数独之上。
我想我需要以某种方式清除旧的数独。有什么想法吗? 我确实通过接口生成器设置了实际数独网格的背景图像。我不想删除它。
绘制数独的方法如下:
- (void)loadSudoku
{
    mainLayer = [[self view] layer];
    [mainLayer setRasterizationScale:[[UIScreen mainScreen] scale]];

    int col=0;
    int row=0;
    for(NSNumber *nr in [[self sudoku] sudoku])
    {
        if([nr intValue] != 0)
        {
            //Print numbers on grid
            CATextLayer *messageLayer = [CATextLayer layer];
            [messageLayer setForegroundColor:[[UIColor blackColor] CGColor]];
            [messageLayer setContentsScale:[[UIScreen mainScreen] scale]];

            [messageLayer setFrame:CGRectMake(col*36+5, row*42, 30, 30)];
            [messageLayer setString:(id)[nr stringValue]];

            [mainLayer addSublayer:messageLayer];
         }

        if(col==8)
        {
            col=0; row++;
        }else
        {
        col++;
        }
    }
    [mainLayer setShouldRasterize:YES];
}
1个回答

10

如果您只想要移除文本图层,可以按照以下步骤操作:

NSIndexSet *indexSet = [mainLayer.sublayers indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    return [obj isMemberOfClass:[CATextLayer class]];
}];

NSArray *textLayers = [mainLayer.sublayers objectsAtIndexes:indexSet];
for (CATextLayer *textLayer in textLayers) {
    [textLayer removeFromSuperlayer];
}

简而言之,第一条语句获取了所有作为根层子层的文本图层的索引。然后在第二个语句中,我们将这些图层放入一个单独的数组中,然后将它们从其超级图层即我们的根层中删除。 原始答案 尝试这样做,
mainLayer.sublayers = nil;

@Deepak 再次感谢。我在我的“viewWillDisappear”方法中测试了它,以便在离开视图时清除所有内容。但是我无法使其工作。我还认为有一个小错误吗?我 indexesOfObjectsPassingTest:*(id obj 应该是 indexesOfObjectsPassingTest:^ (id obj 对吗?然而,这个:return [[obj class] isMemberOfClass:[CATextLayer class]]; 在每个对象上都返回false... - Linus
如果我将[obj class]打印到控制台,我会得到两个CALayer和许多CATextLayer...不知道为什么它不起作用! - Linus
@Linus 应该是 return [obj isMemberOfClass:[CATextLayer class]]; - Deepak Danduprolu
@Deepak 当然可以 :) 现在它运行得非常好。你能更新你的答案,我会标记它为已接受的。 - Linus
在添加评论之前更新它。 - Deepak Danduprolu
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接