繁体   English   中英

如何从UIScrollView删除CAShapeLayer?

[英]How do I remove CAShapeLayer from UIScrollView?

我正在创建录音应用,就像语音备忘录一样。 到目前为止,我已经可以录制,播放,修剪和合并音频了。 我创建波形条的时间轴,就像在任何音乐应用程序中显示条一样。

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

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

此代码写在一个循环中,录制开始后每秒将被调用两次。 从而创建波浪条。 因此,如何删除添加到UIScrollView的图层。 我发现nilling layer.sublayers将删除该层。 但是我不知道如何实现这一点。

一种方法是首先创建一个NSMutableArray指针,该指针指向要添加的CAShapeLayer

然后调用添加层到该数组有点像这样:

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

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

假设您要在X轴的每30px处添加一个图层,这意味着

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM