如何从 UIScrollView 中删除 CAShapeLayer?

Posted

技术标签:

【中文标题】如何从 UIScrollView 中删除 CAShapeLayer?【英文标题】:How do I remove CAShapeLayer from UIScrollView? 【发布时间】:2016-10-25 07:04:44 【问题描述】:

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

当用户停止录制时,如果他出错了,他可以回到特定的秒从那里重新录制。例如,如果他在 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 会删除该层。但我不知道如何实现。

【问题讨论】:

【参考方案1】:

一种方法是首先创建一个NSMutableArray,其中包含指向您要添加的CAShapeLayers 的指针。

然后像这样调用向该数组添加层:

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

我会这样做,如果它有效,请告诉我。

【讨论】:

感谢您的回复。这看起来很有希望。我希望它会奏效。实施后我会通知你 @HirenPrajapati 是否有效或您遇到任何问题? 它就像一个魅力。每秒我创建两个波条。所以在你的提示之后太容易了。谢谢你。赞成的答案

以上是关于如何从 UIScrollView 中删除 CAShapeLayer?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 滚动,啥时候删除?

从《Cash》谈一类分治算法的应用

如何在 UIScrollview 中重新排列和删除 UIView,例如在 iOS 主屏幕中重新排列的应用程序

从 table1 中选择一个日期,然后计算有多少结果 WHERE payment='cash' AND date=table1.date AS cash 并再次用于'credit' [重复]

访问 UIScrollView 中动态加载的标签

如何从 UIScrollView 卸载 UIViewController?