2016-10-25 2 views
0

Я создаю приложение для записи звука точно так же, как голосовое напоминание. Пока я могу записывать, воспроизводить, обрезать и объединять аудио. Я создаю временную шкалу волновых баров, как визуализацию штрихов в любом музыкальном приложении.Как удалить CAShapeLayer из UIScrollView?

Когда пользователь прекращает запись, он может вернуться к определенной секунде, чтобы записать его снова, если он совершит ошибку. Например, если он прекратит запись через 50 секунд, потому что он совершил ошибку через 45 секунд. Он перейдет на 45 секунд, перетащив горизонтальную полосу прокрутки (временная шкала). И когда он нажимает кнопку записи, я хочу очистить все полосы волн через 45 секунд. Как мне это достичь? Вот как я создаю волновые полосы в scrollview, используя CAShapeLayer.

Этот код написан в цикле, который будет называться 2 раза в секунду после начала записи. Таким образом, создается волновая полоса. Итак, как удалить слой, добавленный в UIScrollView. Я обнаружил, что nilling layer.sublayers удалит слой. Но я не знаю, как это реализовать.

ответ

1

Один из способов сделать это, чтобы создать NSMutableArray указателей на CAShapeLayer s, которые вы добавляете.

Затем вызвать добавление слоя в этот массив примерно так:

... 
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 
... 

Вы должны знать, что это barX на 45 секунд и вычислить индекс addedLayers в тот момент времени, давайте назовем его 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

он работал как шарм. В секунду я создаю две волновые полосы. Так что это было слишком легко после вашего намека. Спасибо. Ответ на ответ –

Смежные вопросы