Звук воспроизведения animateWithDuration не повторяется
У меня пульсирующий прямоугольник анимируется с animateWithDuration и setAnimationRepeatCount()
,
Я пытаюсь добавить звуковой эффект в блок анимации, который синхронно "щелкает". Но звуковой эффект играет только один раз. Я не могу найти намека на это нигде.
UIView.animateWithDuration(0.5,
delay: 0,
options: UIViewAnimationOptions.AllowUserInteraction | UIViewAnimationOptions.CurveEaseOut | UIViewAnimationOptions.Repeat,
animations: {
UIView.setAnimationRepeatCount(4)
self.audioPlayer.play()
self.img_MotronomLight.alpha = 0.1
}, completion: nil)
Звуковой эффект должен проигрываться четыре раза, но это не так.
Аудио Реализация:
//global:
var metronomClickSample = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("metronomeClick", ofType: "mp3")!)
var audioPlayer = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
audioPlayer = AVAudioPlayer(contentsOfURL: metronomClickSample, error: nil)
audioPlayer.prepareToPlay()
....
}
@IBAction func act_toggleStartTapped(sender: AnyObject) {
....
UIView.animateWithDuration(....
animations: {
UIView.setAnimationRepeatCount(4)
self.audioPlayer.play()
self.img_MotronomLight.alpha = 0.1
}, completion: nil)
}
2 ответа
Предоставление UIViewAnimationOptions.Repeat
опция НЕ заставляет блок анимации вызываться повторно. Анимация повторяется на CoreAnimation
уровень. Если вы поместите точку останова в блок анимации, вы заметите, что она выполняется только один раз.
Если вы хотите, чтобы анимация выполнялась в цикле вместе со звуком, создайте повторяющуюся NSTimer
и вызвать анимацию / звук оттуда. Имейте в виду, что таймер сохранит цель, поэтому не забудьте аннулировать таймер, чтобы предотвратить сохранение цикла.
РЕДАКТИРОВАТЬ: добавлена реализация ниже
Сначала нам нужно создать таймер, предполагая, что у нас есть переменная экземпляра с именем timer
, Это можно сделать в viewDidLoad:
или же init
метод зрения. После инициализации мы планируем выполнение с циклом выполнения, иначе он не будет запускаться повторно.
self.timesFired = 0
self.timer = NSTimer(timeInterval: 0.5, target: self, selector:"timerDidFire:", userInfo: nil, repeats: true)
if let timer = self.timer {
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)
}
Ниже приведен метод, запускаемый таймером каждый интервал (в данном случае 0,5 секунды). Здесь вы можете запустить анимацию и воспроизведение аудио. Обратите внимание, что UIViewAnimationOptions.Repeat
опция была удалена, так как таймер теперь отвечает за обработку повторяющейся анимации и звука. Если вы используете только таймер для запуска определенное количество раз, вы можете добавить переменную экземпляра для отслеживания времени срабатывания и сделать недействительным таймер, если число превышает пороговое значение.
func timerDidFire(timer: NSTimer) {
/*
* If limited number of repeats is required
* and assuming there's an instance variable
* called `timesFired`
*/
if self.timesFired > 5 {
if let timer = self.timer {
timer.invalidate()
}
self.timer = nil
return
}
++self.timesFired
self.audioPlayer.play()
var options = UIViewAnimationOptions.AllowUserInteraction | UIViewAnimationOptions.CurveEaseOut;
UIView.animateWithDuration(0.5, delay: 0, options: options, animations: {
self.img_MotronomLight.alpha = 0.1
}, completion: nil)
}
Не видя реализации аудиоплеера, некоторые вещи, о которых я могу думать, включают:
Аудиофайл слишком длинный и, возможно, на его конце стоит тишина, поэтому он не воспроизводит первую часть файла, в которой есть звук
аудиофайл должен быть установлен в начало файла каждый раз (он может просто воспроизводить конец файла, остальные 3 раза, что приводит к отсутствию аудиовыхода)
Анимация происходит быстро и аудио не успевает буферизоваться
Надеемся, что эти предложения помогут вам сузить проблему, но не видя реализации плеера, действительно трудно сказать, какова реальная проблема.