Звук воспроизведения 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 раза, что приводит к отсутствию аудиовыхода)

  • Анимация происходит быстро и аудио не успевает буферизоваться

Надеемся, что эти предложения помогут вам сузить проблему, но не видя реализации плеера, действительно трудно сказать, какова реальная проблема.

Другие вопросы по тегам