我使用CALayer和CATextLayers在iPhone上的数独网格上布置数字.
我有一个tableView列出了一些sudokus.当我点击一个表格单元格时,它会在另一个推送到导航控制器的viewController中显示数独.
在我的- (void)viewWillAppear方法中,我称之为我的- (void)loadSudoku方法,我将在下面给你看.
问题是,当你看一个数独时,使用navigationBar中的"后退"按钮返回到表格视图,然后点击另一个数独.然后旧的数独仍然在那里,新的数字被绘制在旧的数独之上.
我想我需要以某种方式清除旧的.有任何想法吗?我确实通过实际数独网格的界面构建器设置了背景图像.我不想删除它.
绘制数独的方法如下所示:
- (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];
}
Run Code Online (Sandbox Code Playgroud)
要仅删除文本图层,您可以执行此操作 -
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];
}
Run Code Online (Sandbox Code Playgroud)
简而言之,第一个语句获取文本层的所有索引,这些索引是超级根层的子层.然后在第二个语句中,我们将所有这些层放在一个单独的数组中,然后我们将它们从它们的超层层移除,这是我们的根层.
原始答案
试试这个,
mainLayer.sublayers = nil;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5998 次 |
| 最近记录: |