【发布时间】:2016-02-11 08:39:59
【问题描述】:
我有一个代码可以在用户点击导航栏中的后退栏按钮时播放声音,代码如下:
@property(strong,nonatomic) SoundPlayer *soundPlayer;
- (IBAction)voltar:(id)sender{
[self.soundPlayer PlaySound:@"back" extension:@"mp3" loops:0];
[self.navigationController popViewControllerAnimated:YES];
}
我的代码运行良好,但我遇到了问题!我想在视图消失时制作不同类型的动画,为此我需要将 popViewControllerAnimated 设置为 NO。
当我做这种事情时,我的播放器不会播放声音!但为什么?我认为因为使用 NO 动画,视图将解除锁定,而声音不会播放,当动画为 YES 时,声音播放得非常好,因为必须有一个短暂的延迟,直到查看场景。
我最后一次尝试是使用 ViewWillDisappear
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.soundPlayer PlaySound:@"back" extension:@"mp3" loops:0];
}
这是我用来关闭视图的动画:
-(void)setAnimation{
CATransition* transition = [CATransition animation];
transition.duration = 0.3;
transition.type = kCATransitionFade;
transition.subtype = kCATransitionFromTop;
[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
}
我该如何解决这个问题?
解决方案
我可以通过创建一个在视图消失之前休眠我的代码的代码来解决这个问题:
[NSThread sleepForTimeInterval:0.1f];
我相信这不是解决这种事情最专业的方法,但是……
解决方案 2
我们可以在转换完成时使用回调:D
-(void)setAnimation{
CATransition* transition = [CATransition animation];
transition.duration = 0.3;
transition.type = kCATransitionFade;
transition.subtype = kCATransitionFromTop;
transition.delegate = self;
[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
}
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
[self.soundPlayer PlaySound:@"back" extension:@"mp3" loops:0];
}
嗯,我认为这是解决这个问题的最好方法和专业方法(比睡觉那个 jerry-rig 更好)
修正
好吧,我对这段代码进行了一些测试,发现 animationDidStop 没有播放声音,播放声音的代码是 viewDidDisappear,但为什么呢? p>
让我们想一想...当我在动画中将委托交给 self 时,我的代码会在动画停止时执行代码,即使所有内容都取自场景(我认为)。
但此时 viewDidDisappear 被调用...并执行歌曲。所以...我需要做的就是将代理赋予我的动画并将声音放入 viewDidDisappear 并删除方法 animationDidStop (就像一个错误,奇怪...)
【问题讨论】:
-
你试过在不同的线程中播放声音吗?
-
@zcui93 与 GDC?是的,我尝试了但没有工作......
-
只需创建一个单例来播放声音。一个会处理所有事情的经理。一些枚举可能很好地指示要播放的声音。接下来,您可以控制要做什么,例如,如果您仍在播放某个声音时应该播放另一个声音......做这些事情的一般方法。
标签: ios objective-c uiviewcontroller avaudioplayer