animateWithDuration 播放声音不重复
animateWithDuration play sound doesn't repeat
我有一个用 animateWithDuration 和 setAnimationRepeatCount()
设置动画的脉冲矩形。
我正在尝试在动画块 中同步添加音效 "clicking"。但音效只播放一次。我在任何地方都找不到任何提示。
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)
}
在没有看到音频播放器的实现的情况下,我能想到的一些事情包括:
音频文件太长,最后可能没有声音,所以它没有播放文件中有声音的第一部分
音频文件每次都需要设置到文件的开头(它可能只是播放文件的结尾,另外3次导致没有音频输出)
动画发生得很快,音频来不及缓冲
希望这些建议能帮助您缩小问题范围,但没有看到播放器的实现,很难说实际问题是什么。
提供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)
}
我有一个用 animateWithDuration 和 setAnimationRepeatCount()
设置动画的脉冲矩形。
我正在尝试在动画块 中同步添加音效 "clicking"。但音效只播放一次。我在任何地方都找不到任何提示。
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)
}
在没有看到音频播放器的实现的情况下,我能想到的一些事情包括:
音频文件太长,最后可能没有声音,所以它没有播放文件中有声音的第一部分
音频文件每次都需要设置到文件的开头(它可能只是播放文件的结尾,另外3次导致没有音频输出)
动画发生得很快,音频来不及缓冲
希望这些建议能帮助您缩小问题范围,但没有看到播放器的实现,很难说实际问题是什么。
提供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)
}