2015-11-10 117 views
0

我有播放声音,当用户点击导航栏上的回栏按钮,这里是代码代码:播放声音时,按后退按钮(不包括动画)

@property(strong,nonatomic) SoundPlayer *soundPlayer; 

- (IBAction)voltar:(id)sender{ 
    [self.soundPlayer PlaySound:@"back" extension:@"mp3" loops:0]; 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

我的代码工作得非常好,但我有一个问题!我想在视图消失时制作不同类型的动画,为此,我需要将popViewControllerAnimated设置为

当我做这种事情时,我的播放器不播放声音!但为什么?我认为,因为有动画,视图将会释放并且声音不会播放,当动画播放时,声音播放效果非常好,因为必须有很短的延迟才能观看场景。

我的最后一次尝试是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]; 
} 

嗯,我想这就是解决这个问题的最好方法和专业的方式(比睡眠的效果是杰里 - 钻机)

修正

嗯,我意识到这个代码的一些测试,并看到animationDidStop不播放声音,播放声音的代码是viewDidDisappear,但是为什么?

让我们思考......当我在我的动画中给委托给自己时,我的代码在动画停止时欠下代码的执行,即使所有东西都从场景中取出(我认为)。

但是在这个时候viewDidDisappear被称为...并执行歌曲。所以...所有我需要做的是给授人以我的动画,并把声音里面viewDidDisappear和删除方法animationDidStop(像一个bug,奇怪...)

+0

你试过在不同的线程中播放声音吗? – zcui93

+0

@ zcui93使用GDC?是的,我尝试但不工作... – LettersBa

+0

只需创建一个单身播放声音。一位将负责处理这一切的经理。一些枚举可能很好地指示播放什么声音。接下来,你可以控制如果在你还在播放某种声音时播放另一个声音,该怎么办......做这种事情的一般方法。 –

回答

1

当前视图控制器有可能会内存不足并失去对soundPlayer的引用。

虽然你可以完全使用单来管理声音播放,你可能会更好使用此处代表团/块模式:

在当前视图控制器头,你可以:

@protocol ViewControllerBLifeCycleDelegate : NSObject 
- (void)vcWillDisappear:(UIViewController *)vc; 
@end 

@interface ViewControllerB : UIViewController 
@property (nonatomic, weak) id<ViewControllerBLifeCycleDelegate> delegate; 
@end 

在执行当前的vc:

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [self.delegate vcWillDisappear:self]; 
} 

最后你可以让呈现视图控制器成为这个视图控制器的委托并且激发你r在那个控制器里的声音

@interface ViewControllerA() <ViewControllerBLifeCycleDelegate> 
@property (nonatomic, strong) SoundPlayer *soundPlayer; 
@end 
@implementation ViewControllerA 
- (void)presentNextViewController { 
    ViewControllerB *vc = [[ViewControllerB alloc] init]; 
    vc.delegate = self; 
    [self.navigationController pushViewController:vc animated:YES]; 
} 

- (void)vcWillDisappear:(UIViewController *)vc { 
    [self.soundPlayer PlaySound:@"back" extension:@"mp3" loops:0]; 
} 
@end 
+1

你也可以完全用块来做到这一点 – mmacdougall