繁体   English   中英

animateWithDuration播放声音不会重复

[英]animateWithDuration play sound doesn't repeat

我有一个用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)
}

提供了UIViewAnimationOptions.Repeat选项不会导致动画块反复调用。 CoreAnimation级别上重复动画。 如果在动画块中放置一个断点,则会注意到该断点仅执行一次。

如果您希望动画与声音一起循环执行,请创建一个重复的NSTimer并从那里调用动画/声音。 请记住,计时器将保留目标,因此不要忘记使计时器无效以防止保留周期。

编辑:下面添加了实现

首先,假设我们有一个名为timer的实例变量,我们将需要创建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次可能只是播放文件的末尾而导致没有音频输出)

  • 动画发生得很快,音频没有时间缓冲

希望这些建议可以帮助您缩小问题的范围,但是在没有看到播放器的实现的情况下,很难说出实际的问题是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM