簡體   English   中英

清除 CALayer

[英]Clear a CALayer

我使用CALayerCATextLayers在 iPhone 上的數獨網格上布置數字。

我有一個列出一些數獨的 tableView。 當我點擊一個表格單元格時,它會在另一個視圖控制器中顯示數獨,該視圖控制器被推送到導航 controller。

在我的- (void)viewWillAppear ... 方法中,我調用了我的- (void)loadSudoku方法,我將在下面向您展示。

問題是當您查看一個數獨時,go 使用導航欄中的“返回”按鈕返回表格視圖,然后點擊另一個數獨。 然后舊數獨還在,新數獨在舊數獨之上繪制。

我想我需要以某種方式清除舊的。 有任何想法嗎? 我確實通過實際數獨網格的界面生成器設置了背景圖像。 我不想刪除這個。

繪制數獨的方法如下所示:

- (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];
}

要僅刪除文本圖層,您可以執行以下操作 -

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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