2012-05-29 52 views
0

下面是我正在使用的一些代碼。核心動畫+核心音頻+睡眠不會發生在預期的順序

我想/什麼期待:

  • 圖片淡入;聲音播放;延遲;圖像淡出。

發生

  • 延遲,聲音播放什麼,圖像淡入然後

任何幫助非常讚賞後淡出。

ViewController.m

[self fadein]; 
NSString *tempFN; 
SystemSoundID soundID; 
tempFN = [[NSString alloc] initWithFormat:@"%@.caf", 
      [myGlobals.gTitleArray objectAtIndex:myGlobals.gQuoteCountForLoop]]; 
NSString *soundFilePath = [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], tempFN]; 
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; 
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, 
         sizeof (sessionCategory), 
         &sessionCategory); 
AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundFileURL, &soundID); 
AudioServicesPlaySystemSound(soundID); 

// Now fade-out the image after a few seconds delay 
sleep(3); 
[self fadeout]; 

-(IBAction)fadein 
{ 
    [UIImageView beginAnimations:NULL context:nil]; 
    [UIImageView setAnimationDuration:2]; 
    [faceImage setAlpha:0.3]; 
    [UIImageView commitAnimations]; 
} 

-(IBAction)fadeout 
{ 
    [UIImageView beginAnimations:NULL context:nil]; 
    [UIImageView setAnimationDuration:1]; 
    [faceImage setAlpha:0]; 
    [UIImageView commitAnimations]; 
} 

回答

1

我相信問題是,當你使用 「睡眠(5)」。使用sleep()函數會阻塞主線程,因此在該時間段內無法完成任何操作。在Objective-C中使用sleep()函數是非常罕見的,除了某些命令行實用程序。 我建議您使用NSTimer而不是sleep()函數。

希望這會有所幫助。

//編輯 另外,如果您確實必須使用sleep(),則應該使用NSThread類的sleepForTimeInterval:函數,並讓代碼的其餘部分在輔助線程上運行。再一次,我真的不認爲你應該使用sleep()函數或任何相關函數。

0

正如另一張海報所說,睡眠是問題。睡眠凍結了主線程。忘記睡眠存在。切勿使用它。睡眠唯一有效的時間是在輔助線程上,當你希望該線程停止運行一段時間,然後只有當你真的知道你正在做什麼與併發(一個非常高級的主題)

什麼你應該做的是重寫你的動畫代碼使用animateWithDuration:動畫:完成:

提供完成塊調用使用嵌套調用animateWithDuration下一個動畫:動畫:完成:

每個動畫將運行到結束,然後調用下一個。

順便說一句,你應該看看AVAudioPlayer。它比AudioServices更強大,並且更易於使用。您只需創建一個AVAudioPlayer並將其播放。

如果您想讓動畫中的某個步驟等待聲音的競爭,AVAudioPlayer會接收一個委託,在聲音播放完成後它將調用它。

以下是我建議你返工動畫序列:

你開始你的動畫序列之前,設置一個AVAudioPlayer,使您的視圖控制器它的委託。

編寫animateWithDuration:動畫:完成調用,其中動畫塊會淡入。

在完成塊中,啓動AVAudioPlayer播放。

在AVAudioPlayer委託方法audioPlayerDidFinishPlaying:successfully:中,調用另一個animateWithDuration:animations:completion:方法,使視圖再次淡出。