2010-09-06 243 views
14

我一直在努力與一個非常惱人的問題整天,我希望我能找到這個委員會的幫助。隱藏狀態欄從MPMoviePlayerController

我正在使用MPMoviePlayerController在iPad上播放全屏電影,我不知道如何刪除狀態欄,儘管我竭盡全力讓它進入地獄,但總是顯示狀態欄。

這裏是方法的代碼,我用它來顯示電影:

-(void)launchVideoFromButton:(id)sender{ 

     NSString *videoPath = [[NSBundle mainBundle] pathForResource:@"movie01" ofType:@"m4v"]; 
     NSURL *videoPathURL = [NSURL fileURLWithPath:videoPath]; 
     moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoPathURL]; 

     [self.view addSubview:moviePlayer.view]; 

     moviePlayer.shouldAutoplay = YES; 
     moviePlayer.movieSourceType = MPMovieSourceTypeFile; 


     [moviePlayer setFullscreen:YES animated:YES]; 
     moviePlayer.controlStyle = MPMovieControlStyleFullscreen; 

     NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 
     [notificationCenter addObserver:self selector:@selector(moviePlayerEvent:) name:MPMoviePlayerLoadStateDidChangeNotification object:moviePlayer]; 

    } 



    -(void)moviePlayerEvent:(NSNotification*)aNotification{ 

     [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO]; 
     NSLog(@"%i", [UIApplication sharedApplication].statusBarHidden); 

    } 

在控制檯中,我可以看到電影出現時moviePlayerEvent被解僱,但狀態欄仍然存在:[[UIApplication的sharedApplication] setStatusBarHidden:YES withAnimation:NO]似乎不可操作。我一直試圖使用其他MPMoviePlayerController通知沒有運氣。

任何人都可以幫助我嗎?

在此先感謝。

回答

9

不要將電影播放器​​的視圖添加到主視圖;相反,模態呈現電影播放器​​如下(略去了/清晰一些步驟):

moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:url]; 

// Register for the playback finished notification. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(myMovieFinishedCallback:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:moviePlayerViewController.moviePlayer]; 


//Present 
    [self presentMoviePlayerViewControllerAnimated:moviePlayerViewController]; 

    // Play the movie! 
    self.moviePlayerViewController.moviePlayer.movieSourceType = MPMovieSourceTypeFile; 
    [self.moviePlayerViewController.moviePlayer play]; 



// When the movie is done, release the controller. 
-(void)myMovieFinishedCallback:(NSNotification*)aNotification 
{ 

    //NSLog(@"playback terminated"); 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:MPMoviePlayerPlaybackDidFinishNotification 
                object:moviePlayerViewController.moviePlayer]; 


    [moviePlayerViewController release], moviePlayerViewController = nil; 


} 
0

這不是一個答案,我有同樣的問題。有一部分我可以更新,但是..

狀態欄只顯示控件顯示時。

點擊電影,隱藏狀態欄上的控件&,再次單擊,顯示控件,並且狀態欄也會返回。

我還在我啓動電影之前以編程方式隱藏狀態欄。

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];

,這裏是我如何我加入電影:

[[[UIApplication sharedApplication] keyWindow] addSubview: movieView];

1

的狀態欄也牆根,但再次展示了播放控制。

-(void)viewDidLoad:{ 
     [super viewDidLoad]; 
     MPMoviePlayerViewController *moviePlayerViewController = 
       [[MPMoviePlayerViewController alloc] initWithContentURL:videoURL]; 

     [[NSNotificationCenter defaultCenter] addObserver:self 
       selector:@selector(playbackStateChange:) 
       name:MPMoviePlayerLoadStateDidChangeNotification 
       object:moviePlayerViewController.moviePlayer]; 
    } 
    -(void)playbackStateChange:(NSNotification*)notification{ 
     if([[UIApplication sharedApplication]respondsToSelector:@selector(setStatusBarHidden: withAnimation:)]) 
     [[UIApplication sharedApplication] setStatusBarHidden:YES 
         withAnimation:UIStatusBarAnimationNone]; 
     else 
      [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; 
} 
22

不幸的是,運行到這個非常的問題,通過研究和多次試驗後,我已經決定了它是幾乎不可能保持隱藏在全屏模式下iOS的狀態欄。無論你做什麼,當顯示全屏播放器控件時,狀態欄也會顯示(它不會遵守setStatusBarHidden:YES)。嵌入式播放器控件並非如此,但用戶可以在嵌入式和全屏模式之間輕鬆切換,所以在顯示控件時,您不能真正使用它來保持沒有狀態欄。

當然,至少在狀態欄中消失時,控制淡出...

+0

+1正確答案。請提交有關此問題的錯誤報告。 – Till 2011-04-23 01:49:29

+0

太愚蠢了,我有一個空的狀態欄,我無法擺脫它。 – EladG 2012-11-01 02:28:30

0

對於那些已經運行到這個問題,我發現我自己的解決方案,可能的幫助。它只適用於您的應用程序的其餘部分未顯示狀態欄,並且在電影完成並返回到界面時嘗試再次隱藏它,而不是在播放過程中。

如果將MPMoviePlayerController作爲子視圖添加到正在推送到導航控制器視圖堆棧的UIView中,則可以使用該父視圖控制器的viewWillDisappear方法來幫助您。

在該方法中,您可以將控件樣式更改爲無,這將在視圖消失之前清除任何和所有電影播放器​​控件,並且如果已將其設置爲隱藏,則清除狀態欄。這對於用戶來說是完全不可見的,因爲視圖正在離開屏幕,並且他們不再與其交互。

0

我有同樣的問題,但我加入到我的info.plistStatus bar is initially hidden - Boolean - YES它的工作原理!
順便說一句我正在使用iOS 5.1,Xcode 4.3.2。

+0

這將工作,除非你想爲你的應用程序的狀態欄,而不是電影。 – Cthutu 2012-05-24 14:57:21

+1

我有'最初隱藏狀態欄'設置爲'YES'(OpenGL ES應用程序),但是當我以模態方式呈現'MPMoviePlayerController'時,狀態欄出現。 – 2013-01-08 06:56:15

+0

我的狀態欄隱藏設置爲YES,我仍然收到一個狀態欄。 rcw3的回答是正確的,如果你使用全屏控制,你不能隱藏狀態欄。 – 2013-03-04 23:54:15

1

使用MPMovieControlModeVolumeHidden我沒有工作,只是工作的一個是MPMovieControlModeVolumeOnly在全屏視頻:

myMoviePlayer.controlStyle = MPMovieControlModeVolumeOnly; 
[myMoviePlayer setFullscreen:YES]; 

而且也,我加入電影視圖作爲一個子視圖到父視圖:

[parentView addSubview:myMoviePlayer.view]; 

我的應用程序應該沒有狀態欄和向後兼容性我使用的應用程序代理下面的代碼:

if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden: withAnimation:)]) 
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; 
else 
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; 
2

它爲我用MPMoviePlayerViewController, 設置以下

[moviePlayerController.moviePlayer setFullscreen:YES animated:NO]; 
moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleFullscreen; 

在此之前:

[self presentViewController:moviePlayerController animated:NO completion:^{ }]; 

和下面的右後:

moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleNone; 

剛萬一,我也是這樣做的:

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayerLoadStateDidChange:) 
               name:MPMoviePlayerLoadStateDidChangeNotification object:nil]; 

... 


- (void)moviePlayerLoadStateDidChange:(NSNotification *)notification { 


    if ([[moviePlayerController moviePlayer] loadState] == MPMovieLoadStateStalled) { 

    } else if([[moviePlayerController moviePlayer] loadState] != MPMovieLoadStateUnknown) { 

     [moviePlayerController moviePlayer].controlStyle = MPMovieControlStyleNone; 

     ... 
    } 
} 

所以,沒有狀態欄,沒有控制......沒有什麼,只有純粹的視頻。 )

(在iOS 5.1設備和6.0模擬器上測試)。

+0

非常可悲的消息......我沒有首先注意到,但是看起來,當我們隱藏電影播放中的所有內容時,狀態欄不會出現在電影關閉中。這顯然是iOS中的一個錯誤,因爲它不會消失,因爲我不直接做任何與它有關的任何事情......並且在此之後,當我打開某個模式控制器時,例如,可能會「刷新」應用程序上下文或其他。 無論如何...爲了使狀態欄仍然出現,我只是趕上電影完成時的最後一刻,並做moviePlayerController.movi​​ePlayer.controlStyle = MPMovieControlStyleFullscreen; – Agat 2012-11-10 11:38:48

+0

我也必須手動停止視頻[moviePlayerController.movi​​ePlayer stop];在手動關閉電影控制器之後,否則當控制器已經消失時,我要麼在屏幕上留下黑屏,要麼在後臺播放視頻聲音。所以,iOS的相當「有趣」的行爲。那麼我該如何捕捉視頻「將完成」在這裏描述: http://stackoverflow.com/a/13318267/691660。 祝大家好運! ) – Agat 2012-11-10 11:39:53

0

我不知道我的解決方案是否適用於您的問題,但它適用於我的設置,即運行iOS 5.1的第四代iPod。

我的應用程序根本沒有顯示狀態欄,而在info.plist文件中,相應的條目「狀態欄最初是隱藏的」被設置爲YES。

我也直接將MPMoviePlayerController視圖添加到其父視圖。以下是設置電影播放器​​的代碼:

moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:theurl]; 
[moviePlayer.view setFrame:frame]; // This is set to (0, 0, 320, 480) 
[moviePlayer prepareToPlay]; 
[moviePlayer setShouldAutoplay:YES]; 
moviePlayer.fullscreen = TRUE; 
moviePlayer.controlStyle = MPMovieControlStyleFullscreen; 
[self.view addSubview:moviePlayer.view]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playBackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 

moviePlayer是一個類變量。

當玩家完成播放時,或者當觀衆按下moviePlayer控制器的「完成」按鈕,則playbackFinished:方法稱爲:

- (void)playBackFinished:(NSNotification *)notif{ 
moviePlayer.controlStyle = MPMovieControlStyleNone; 
[moviePlayer stop]; 
[moviePlayer.view removeFromSuperview]; 

[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 
[moviePlayer release]; 
moviePlayer = nil; 
} 

在其中moviePlayer的控制樣式設置爲MPMovieControlStyleNone到阻止任何控件,但實際上狀態欄不會在MoviePlayer從其父視圖中移除時顯示。