1

您好,我正在使用CAShapeLayerand CGPath。我正在绘制拼图并添加到scrollview。我放了重新加载按钮来检查性能。当我重新加载时,我正在删除所有以前的图层scrollview。一段时间后它崩溃了。

僵尸向我展示了删除图层的原因,这就是问题所在。这在代码中有什么问题吗?这里是 :

NSArray* layerArray = [[self.scrollView.layer sublayers]copy];

    for (int i = 0; i < layerArray.count; i++) {
        A3JigsawView* aJigsawView = [layerArray objectAtIndex:i];
        [aJigsawView removeFromSuperlayer];
    }
    self.scrollView.layer.sublayers = nil;

    prevWidth = 0;
    prevHeight = 0;

请帮助我。谢谢。

4

2 回答 2

5

self.scrollView.layer.sublayers = nil。不加选择地删除所有子层会在 iOS 7 中导致严重的崩溃,这可能会在程序执行的更晚发生。我已经使用rootLayer.sublayers = nil和彻底测试了这一点[rootLayer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)]。一定有一个系统创建的层被搞砸了。

您必须保留自己的图层数组并自己删除它们:

[myArrayOfLayersIAddedMyself makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
于 2014-01-21T13:08:22.347 回答
0

我们需要跟踪在相应视图上绘制的图层。例如:NSMutableArray *listOfCAShapeLayer;

UIBezierPath *pathToDraw = [UIBezierPath bezierPath];
[pathToDraw moveToPoint:startPoint];
[pathToDraw addLineToPoint:endPoint];
[pathToDraw stroke];

CAShapeLayer  *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = [pathToDraw CGPath];
shapeLayer.strokeColor = [[UIColor blueColor] CGColor];
shapeLayer.lineWidth = 3.0;
shapeLayer.fillColor = [[UIColor clearColor] CGColor];

[self. listOfCAShapeLayer addObject:shapeLayer];

[self.imageView.layer addSublayer:shapeLayer];

现在我们将 CAShapeLayer 保存在数组 self 中。listOfCAShapeLayer 我们可以在需要擦除函数的地方检查条件,例如: Bool bIsErase; if (bISErase == YES) 然后执行以下命令:

[self. listOfCAShapeLayer enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){

CAShapeLayer *sl = obj;
[sl removeFromSuperlayer];

}];

我希望这对你现在有帮助。

于 2016-02-24T09:28:38.387 回答