0

下面是我正在使用的一些代码。

我想要/期望的:

  • 图像淡入;声音播放;延迟; 图像淡出。

发生什么了

  • 延迟,声音播放,图像淡入然后立即淡出

非常感谢任何帮助。

视图控制器.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];
}
4

2 回答 2

1

我相信问题出在你使用“sleep(5)”时。使用 sleep() 函数会阻塞主线程,因此在该时间段内无法进行任何操作。在 Objective-C 中使用 sleep() 函数是非常罕见的,除非在某些命令行实用程序中。我建议您使用 NSTimer 而不是 sleep() 函数。

希望这可以帮助。

//Edit 另外,如果你真的必须使用 sleep(),你应该使用 NSThread 类的 sleepForTimeInterval: 函数,并让其余代码在辅助线程上运行。再一次,我真的不认为你应该使用 sleep() 函数或任何相关函数。

于 2012-05-29T05:47:09.510 回答
0

正如另一张海报所说,睡眠是问题所在。睡眠冻结主线程。忘记睡眠的存在。永远不要使用它。sleep 唯一有效的时间是在辅助线程上,当您希望该线程停止运行一段时间,然后只有当您真的知道您在使用并发做什么时(一个非常高级的主题)

你应该做的是重写你的动画代码以使用 animateWithDuration:animations:completion:

提供一个完成块,该块使用对 animateWithDuration:animations:completion 的嵌套调用来调用下一个动画:

每个动画都会运行到最后,然后调用下一个。

顺便说一句,你应该看看 AVAudioPlayer。它比 AudioServices 更强大,更易于使用。您只需创建一个 AVAudioPlayer 并告诉它播放。

如果您希望动画中的某个步骤等待声音竞争,则 AVAudioPlayer 会接受一个委托,一旦声音播放完毕,它将调用该委托。

以下是我建议您重新制作动画序列的方法:

在你开始你的动画序列之前,设置一个 AVAudioPlayer 并使你的视图控制器成为它的代理。

编写一个 animateWithDuration:animations:completion 调用,动画块让你淡入。

在完成块中,开始播放 AVAudioPlayer。

在 AVAudioPlayer 委托方法 audioPlayerDidFinishPlaying:successfully: 中,调用另一个 animateWithDuration:animations:completion: 方法再次淡出您的视图。

于 2012-05-30T00:44:47.817 回答