【问题标题】:animateWithDuration play sound doesn't repeatanimateWithDuration 播放声音不重复
【发布时间】:2015-08-25 21:49:14
【问题描述】:

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

【问题讨论】:

  • 动画会重复吗?
  • 有声音播放吗?音频剪辑有多长?
  • 动画重复。声音只播放一次。音频剪辑只需点击一下:长度0.36 s,格式为mp3

标签: ios swift playback animatewithduration soundeffect


【解决方案1】:

提供UIViewAnimationOptions.Repeat 选项不会导致动画块被重复调用。动画在CoreAnimation 级别上重复。如果在动画块中放置断点,您会注意到它只执行一次。

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

编辑:在下面添加了实现

首先,我们需要创建计时器,假设我们有一个名为timer 的实例变量。这可以在视图的viewDidLoad:init 方法中完成。初始化后,我们用run loop调度执行,否则不会重复触发。

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)
}

【讨论】:

  • 好的,我明白了,这就是问题所在。我是 Swift 的新手。您能否提供一个有关如何实现同步调用动画和声音的 NSTimer 的示例?提前致谢。
  • 请检查更新的答案与实施。
  • 鼓舞人心的解决方案,在 mainRunLoop 上添加计时器。这解决了我的问题。非常感谢!!!
【解决方案2】:

没有看到音频播放器的实现,我能想到的一些事情包括:

  • 音频文件太长,可能在它的末尾有静音,所以它没有播放文件的第一部分,其中有声音

  • 每次都需要将音频文件设置为文件的开头(可能只是播放文件末尾的其他3次导致没有音频输出)

  • 动画发生得很快,音频来不及缓冲

希望这些建议可以帮助您缩小问题的范围,但是如果没有看到播放器的实现,真的很难说真正的问题是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多