如何从 UIScrollView 中删除 CAShapeLayer?
How do I remove CAShapeLayer from UIScrollView?
我正在创建类似于语音备忘录的录音应用程序。到目前为止,我能够录制、播放、trim 和合并音频。我创建波形条的时间线,就像在任何音乐应用程序中可视化条形图一样。
当用户停止录制时,如果他犯了错误,他可以回到特定的秒从那里重新录制。例如,如果他在 50 秒时停止录制,因为他在 45 秒后犯了一个错误。他将通过拖动水平滚动条(时间轴)转到 45 秒。当他点击录制按钮时,我想在 45 秒后清除所有波条。我如何实现这一目标?这就是我使用 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];
这段代码写在一个循环中,录制开始后每秒调用2次。从而创建波浪条。那么如何删除添加到 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 轴上每 30 像素添加一层,这意味着
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)];
我就是这样做的,如果可行请告诉我。
我正在创建类似于语音备忘录的录音应用程序。到目前为止,我能够录制、播放、trim 和合并音频。我创建波形条的时间线,就像在任何音乐应用程序中可视化条形图一样。
当用户停止录制时,如果他犯了错误,他可以回到特定的秒从那里重新录制。例如,如果他在 50 秒时停止录制,因为他在 45 秒后犯了一个错误。他将通过拖动水平滚动条(时间轴)转到 45 秒。当他点击录制按钮时,我想在 45 秒后清除所有波条。我如何实现这一目标?这就是我使用 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];
这段代码写在一个循环中,录制开始后每秒调用2次。从而创建波浪条。那么如何删除添加到 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 轴上每 30 像素添加一层,这意味着
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)];
我就是这样做的,如果可行请告诉我。