2015-11-10 186 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