2011-12-02 17 views
6

Resimde veya manzarada video tam ekran oynatmayı sağlayan MPMoviePlayerController nesnesine sahibim. Video oynatılırken yönelimi döndürürüm ve video oynatılmaya başladıktan ve video durum çubuğu göründükten sonra birkaç saniye içinde dönüş yaparsam, video gezinme çubuğum bittiğinde mükemmel olur. Ama video durumu çubuğunun video oynatma içine birkaç saniye kaybolmasını bekleyip oryantasyonu döndürene kadar beklerseniz, video navigationBar bittiğinde, yukarı itilmiş gibi durum çubuğunun arkasında kısmen gizlidir.navigationBar ve MPMoviePlayerController'ın son derece garip davranışı. IOS'ta hata mı, yoksa hatay mı?

Hiç böyle bir şey gördünüz mü?

Bu hatayı kolayca yeniden oluşturabiliyorum. Yeni bir Tek Görünüm Uygulaması oluşturdum ve sadece bir düğme ve bir gezinme çubuğu ekledim. Video oynatılırken yönlendirmeyi döndürürsem, tam ekran özelliğini etkinleştirmek için simgesine dokunun ve video bittiğinde video durum çubuğu hala görünebilir, her şey yolunda. Ancak, video durum çubuğunun kaybolmasından sonra dönmeyi beklersem, döndürdüğümde ve video bittiğinde, navigationBar durum çubuğunun altında. Görüntüyü bakınız: Burada

iPhone Image

kullanıyorum basit kodudur: Aşağıda verilen önerilerle şu anda neredeyim

İşte
- (void) playMovie { 
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource: @"movie" ofType: @"mov"]]; 
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: url]; 

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

moviePlayer.controlStyle = MPMovieControlStyleDefault; 
moviePlayer.shouldAutoplay = YES; 

[self.view addSubview: moviePlayer.view]; 
[moviePlayer setFullscreen: YES animated: YES]; 

- (void) moviePlayBackDidFinish: (NSNotification *) notification 
    MPMoviePlayerController *player = [notification object]; 
[[NSNotificationCenter defaultCenter] removeObserver: self 
               name: MPMoviePlayerPlaybackDidFinishNotification 
               object: player]; 

if ([player respondsToSelector: @selector(setFullscreen:animated:)]) 
{ 
    [player.view removeFromSuperview]; 
} 

olduğunu. Yanlış bir şeyim olmalı çünkü maalesef hala aynı problemim var. İşte

yöntem onPlayerWillExitFullScreen

UIView *view = [[[UIApplication sharedApplication] delegate].window.subviews lastObject];  
if (view) { 
    [view removeFromSuperview]; 
    [[[UIApplication sharedApplication] delegate].window addSubview:view]; 
} 

MPMoviePlayerController *player = [aNotification object]; 
[[NSNotificationCenter defaultCenter] removeObserver: self 
               name: MPMoviePlayerWillExitFullscreenNotification 
               object: player];  

ve burada benim şimdiki playMovie yöntem şudur: MPMoviePlayerWillExitFullscreenNotification bildirimi için dinlerseniz

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource: @"movie" ofType: @"mov"]]; 
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: url]; 

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

[[NSNotificationCenter defaultCenter]addObserver: self 
             selector: @selector(onPlayerWillExitFullScreen:) 
              name: MPMoviePlayerWillExitFullscreenNotification 
              object: self.moviePlayer]; 

moviePlayer.controlStyle = MPMovieControlStyleDefault; 
moviePlayer.shouldAutoplay = YES; 

[self.view addSubview: moviePlayer.view]; 
[moviePlayer setFullscreen: YES animated: YES]; 
+0

Ekran görüntüsü veya iki tane eklemek isteyebilirsiniz. –

+0

Öneriniz için teşekkürler Jeff. –

+0

Ekran görüntüsü bağlantınız kesildi. – JonasCz

cevap

5

Tamam, benim bakış denetleyicisi bu yerleştirerek bu kodu çözülmüş bir MPMoviePlayerController sonra bir UIWebView içinde her şeyden önce benim app üzerinden bu heyecanlanıyorum aynı hata buldum.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    [self.navigationController setNavigationBarHidden:NO animated:YES]; 
} 

Zor hatalar, zor düzeltmeler.

+0

Son olarak, çok teşekkür ederim. - (void) movieFinished: (NSNotification *) aNotification –

+0

Saygılarımla kodu koydum Teşekkürler adam, son olarak –

+0

güzel hile, iOS 5.0 benim için çalıştı – rakeshNS

5

, aşağıdaki gibi düzgün yeniden çizmek için ana görüşlerini zorlayabilir . Başvurulan 'pencere', uygulamanızın ana UIWindow nesnesidir.

MPMoviePlayerController tam ekran moduna geçtiğinde, aslında videoyu sunmak için ayrı bir UIWindow örneği oluşturur. Bildirimi geri geçişi yakaladığında, bu kod doğru şekilde yeniden hizalamak için geri döndüğünüz görünümleri sağlayacaktır.

Kuşkusuz bu, zarif bir çözüm değil, her seferinde işe yarıyor.

UIView *view = [window.subviews lastObject]; 
if (view) { 
    [view removeFromSuperview]; 
    [window addSubview:view]; 
} 

bu bildirim için, size self.playerController sizin MPMoviePlayerController nesnesidir böyle bir şey yapmak gerekir dinlemek için.

Müzikçaları serbest bıraktığınızda bu bildirimi dinlemeyi bırakmayı unutmayın!

// Determine the default notification centre 
    NSNotificationCenter *centre = [NSNotificationCenter defaultCenter]; 
    // Listen for interesting movie player notifications 
    [centre addObserver: self 
       selector: @selector(onPlayerWillExitFullScreen:) 
        name: MPMoviePlayerWillExitFullscreenNotification 
       object: self.playerController]; 
+0

Yardımlarınız için teşekkür ederiz. Programlamada yeniyim, bu yüzden bu bildirimi nasıl uygulayacağımı pek emin değilim ama ona bir şans vereceğim. Bir çözüm olduğunu bilmek beni çok rahatlattı. –

+0

Bu yanıtı sizin için eklemek üzere güncellendi. – reddersky

+0

UIWindow nesnesine göre kafam karıştı. Basit test uygulamamı al, tüm sahip olduğum tek bir Görünüm Uygulaması sadece bir düğme ve bir navigationBar. "Self.view" ile "window" altını denedim ama doğru olmamalı. –

3
- (void) moviePlayerWillExitFullScreen:(id)sender { 

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

} 

Çocuklar bunu deneyin ... Benim için çalışıyor.Başka birçok yolu denedim ve sadece bu çalıştı.