簡體   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