2016-10-25 5 views
0

私は音声メモと同じようにオーディオレコーディングアプリを作成しています。これまでは、オーディオを録音、再生、トリム、マージすることができました。私はどの音楽アプリでもバーの視覚化のような波バーのタイムラインを作成します。UIScrollViewからCAShapeLayerを削除するにはどうすればよいですか?

ユーザーが録音を停止すると、間違えた場合は、特定の秒に戻って再度録音することができます。たとえば、45秒後にミスをしたために、50秒で録音を停止するとします。彼は水平スクロールバー(タイムライン)をドラッグして45秒になる。録音ボタンをタップすると、45秒後にすべてのウェーブ・バーをクリアしたい。これをどのように達成するのですか?これは私がCAShapeLayerを使ってスクロールビューにウェーブバーを作成する方法です。

このコードは、記録が開始されてから2秒ごとに呼び出されるループで書かれています。こうして波バーが作られます。だから、UIScrollViewに追加されたレイヤーを削除するにはどうすればいいですか?私はlayer.sublayersのnillingがレイヤーを削除することを発見しました。しかし、私はこれを実装する方法を知らない。

答えて

1

これを行う1つの方法は、最初に追加するCAShapeLayerへのポインタのNSMutableArrayを作成することです。

はその後ややこのようにその配列にレイヤーを追加する呼び出し:

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

私はおそらくCGFloatbarXは数のいくつかの並べ替えであると仮定していますし、同じ定数により30秒ごとに増加しています。今度はbarXを追加したレイヤーのインデックスにbarXを変換する式を見つける必要があります。

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

を意味しているあなたは45秒でbarXが何であるかを知っていると、その時点でaddedLayersの指標を計算する、のはそれに名前を付けるせてください、あなたはレイヤーにX軸のすべての30pxを追加していると言いますindex

は今45秒でタップし、ユーザーの後にあなたがループを実行します。それが何をしたか

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

を、それ以降は45秒からのすべての層を取り除いています。 は今、あなたは、配列からそれらを削除する必要があり、その後私はそれを行うだろう方法です

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

を実行し、それが動作するかどうか私に知らせてください。

+0

お返事ありがとうございます。それは有望そうだ。私はそれがうまくいくことを望む。 –

+0

@HirenPrajapatiを実装した後にお知らせします。問題が発生しましたか? – tomiQrsd

+0

それは魅力のように働いた。毎秒私は2つのウェーブバーを作成しています。あなたのヒントの後でそれはとても簡単でした。ありがとうございました。アップ投票の答え –

関連する問題