Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clear a CALayer

I use a CALayer and CATextLayers to lay out the numbers on a sudoku grid on the iPhone.

I have a tableView that lists some sudokus. When I tap one table cell it shows the sudoku in another viewController that is pushed on to the navigation controller.

In my - (void)viewWillAppear... method I call my - (void)loadSudoku method which I will show you below.

The problem is when you look at one sudoku, go back to the table view using the "back" button in the navigationBar and then tap another sudoku. Then the old sudoku is still there, and the new one is drawn on top of the old one.

I guess I need to clear the old one somehow. Any ideas? I do have a background image set through the interface builder of the actual sudoku grid. I don't want to remove this.

The method that draws the sudoku looks like this:

- (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];
}
like image 294
Linus Avatar asked May 30 '11 10:05

Linus


1 Answers

To remove only text layers, you can do this –

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

In a nutshell, the first statement gets all the indices of text layers which are a sublayer to over root layer. Then in the second statement we get all those layers in a separate array and then we remove them from their superlayer which is our root layer.

Original Answer

Try doing this,

mainLayer.sublayers = nil;
like image 51
Deepak Danduprolu Avatar answered Sep 30 '22 23:09

Deepak Danduprolu