如何从UIScrollView中删除CAShapeLayer?

时间:2016-10-25 07:04:44

标签: ios objective-c uiscrollview uibezierpath cashapelayer

我正在创建录音应用程序,就像语音备忘录一样。到目前为止,我能够录制,播放,修剪和合并音频。我创建波浪条的时间线就像任何音乐应用中的条形可视化一样。

当用户停止录音时,如果他出错,他可以回到特定的秒钟再次从那里录制。例如,如果他在50秒后停止录音,因为他在45秒后犯了错误。他将拖动水平滚动条(时间轴)到45秒。当他点击录制按钮时,我想在45秒后清除所有波浪条。我该如何实现这一目标?这就是我使用CAShapeLayer在scrollview中创建波浪的方法。

CAShapeLayer *shapeLayer = [CAShapeLayer layer];
[shapeLayer setPath:[[UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, barWidth, barHeight) cornerRadius:2] CGPath]];
shapeLayer.fillColor = [UIColor whiteColor].CGColor;
shapeLayer.position = CGPointMake(barX, scrlViewBars.frame.size.height - barHeight);
[scrlViewBars.layer addSublayer:shapeLayer];

此代码以循环方式写入,在录制开始后每秒调用2次。从而产生波浪条。那么如何删除添加到UIScrollView的图层。我发现nilling layer.sublayers会删除该图层。但我不知道如何实现这一点。

1 个答案:

答案 0 :(得分:1)

这样做的一种方法是首先创建一个NSMutableArray指向您要添加的CAShapeLayer的指针。

然后调用添加图层到这个数组:

...
shapeLayer.position = CGPointMake(barX, scrlViewBars.frame.size.height - barHeight);
[addedLayers addObject:shapeLayer];
[scrlViewBars.layer addSublayer:shapeLayer];

我假设barX是某种数字,可能是CGFloat并且每30秒以相同的常数递增。现在,您需要找到一个公式,将barX转换为在barX添加的图层索引。

假设您每隔30px的X轴添加一层,这意味着

barX 0 --> index 0
barX 30 --> index 1
barX 60 --> index 2
...

您应该知道45秒时barX是什么,并计算该时间点addedLayers的索引,我们将其命名为index

现在用户点击了45秒后你就开始了一个循环:

for(int i = index; i < addedLayers.count; i++){
    [[addedLayers objectAtIndex:i] removeFromSuperlayer];
}

它做的是从45秒开始删除所有图层。 此后,您必须从阵列中删除它们,然后运行

 [addedLayers removeObjectsInRange:NSMakeRange(index, [addedLayers count] - index)];

这就是我这样做的方式,让我知道它是否有效。