2015-08-25 80 views
1

我有一個帶有animateWithDuration和setAnimationRepeatCount()動畫的脈衝矩形。animateWithDuration播放聲音不重複

我試圖在動畫塊中添加聲音效果的女巫是同步「點擊」。但音效只播放一次。我無法在任何地方找到任何提示。

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

動畫重複嗎? – ricky3350

+0

聲音是否播放?音頻片段有多長? – dudeman

+0

動畫重複。聲音只播放一次。音頻剪輯只是一個短的點擊:長度0.36秒,格式MP3 –

回答

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

好的,我明白了,這就是問題所在。我對Swift很陌生。你能提供一個關於如何實現一個同步調用動畫和聲音的NSTimer的例子嗎?提前致謝。 –

+0

請檢查更新的答案與實施。 – dbart

+0

鼓舞人心的解決方案,在mainRunLoop上添加定時器。這解決了我的問題。非常感謝你!!! –

0

沒有看到音頻播放器實現的一些事情,我能想到的包括:

  • 音頻文件太長,也許對最終的沉默它所以它沒有播放文件的第一部分,其中有聲音

  • 需要將音頻文件設置爲fil的開頭Ë每次(它可能只是在玩其他的3倍,導致沒有音頻輸出文件的末尾)

  • 動畫正在發生迅速和音頻沒有足夠的時間來緩衝

希望這些建議可以幫助你縮小問題範圍,但是如果沒有看到玩家的執行情況,就很難說出實際的問題。