2011-12-02 29 views
6

Tôi có đối tượng MPMoviePlayerController phát toàn màn hình video ở cả dọc hoặc ngang. Nếu tôi xoay hướng trong khi video đang phát và thực hiện xoay vòng trong vài giây sau khi video bắt đầu phát và thanh trạng thái video hiển thị, khi video kết thúc thanh điều hướng của tôi là hoàn hảo. Nhưng nếu tôi chờ cho đến khi thanh trạng thái video biến mất một vài giây vào video đang phát và sau đó xoay hướng, khi video kết thúc, navigationBar của tôi bị ẩn một phần phía sau thanh trạng thái, như bị đẩy lên.Hành vi cực kỳ kỳ lạ của navigationBar và MPMoviePlayerController. Lỗi trong iOS hoặc lỗi của tôi?

Bạn đã bao giờ thấy điều gì đó như thế này chưa?

Tôi có thể tạo lại lỗi này dễ dàng. Tôi đã tạo một Ứng dụng Chế độ xem đơn mới và chỉ cần thêm nút và thanh điều hướng. Nếu tôi xoay hướng trong khi đang phát video, hãy nhấn để bật chế độ toàn màn hình và thanh trạng thái video vẫn hiển thị khi video kết thúc, tất cả đều tốt. Nhưng, nếu tôi chờ đợi để xoay sau khi thanh trạng thái video biến mất, khi tôi xoay và video kết thúc, thanh điều hướng nằm trong thanh trạng thái. Xem hình ảnh:

iPhone Image

Đây là mã đơn giản, tôi đang sử dụng:

- (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]; 
} 

Đây là nơi tôi hiện đang ở với những gợi ý đưa ra dưới đây. Tôi phải có một cái gì đó sai vì tiếc là tôi vẫn còn có cùng một vấn đề.

Dưới đây là phương pháp 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];  

và đây là hiện playMovie phương pháp của tôi:

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

Bạn có thể muốn bao gồm ảnh chụp màn hình hoặc hai ảnh chụp màn hình. –

+0

Cảm ơn Jeff đã đề xuất. –

+0

Liên kết của bạn đến ảnh chụp màn hình bị hỏng. – JonasCz

Trả lời

5

Ok, vì vậy tôi tìm thấy lỗi cùng hoảng này trên tất cả ứng dụng của tôi đầu tiên trong một UIWebView sau đó trong một MPMoviePlayerController, tôi giải quyết đặt này mã này trong điều khiển quan điểm của tôi.

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

Lỗi khó xử, sửa lỗi phức tạp.

+0

Cuối cùng !! Cảm ơn bạn rất nhiều. Tôi phải chơi một chút nhưng đã hiểu Tôi đã đặt mã bên trong - (void) movieFinished: (NSNotification *) aNotification –

+0

Cảm ơn người đàn ông, cuối cùng! –

+0

mẹo hay, nó đã hoạt động trên iOS 5.0 – rakeshNS

5

Nếu bạn lắng nghe thông báo MPMoviePlayerWillExitFullscreenNotification, bạn có thể buộc quan điểm chính của bạn để vẽ lại đúng như sau . 'Cửa sổ' được tham chiếu là đối tượng UIWindow chính của ứng dụng của bạn.

Khi MPMoviePlayerController chuyển sang chế độ toàn màn hình, nó thực sự tạo một cá thể UIWindow riêng biệt để trình bày video. Bằng cách đánh dấu thông báo khi nó chuyển tiếp trở lại, mã này sẽ đảm bảo các chế độ xem bạn đang chuyển trở lại để căn chỉnh lại chính xác.

Phải thừa nhận rằng đây không phải là giải pháp thanh lịch, nhưng nó hoạt động mọi lúc.

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

Để nghe thông báo này, bạn sẽ cần thực hiện một việc như thế này, trong đó self.playerController là đối tượng MPMoviePlayerController của bạn.

Hãy nhớ ngừng nghe thông báo này sau khi bạn phát hành trình phát mặc dù!

// 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

Cảm ơn sự giúp đỡ của bạn. Tôi mới lập trình vì vậy tôi không chắc chắn làm thế nào để thực hiện thông báo đó nhưng tôi sẽ cho nó một shot. Tôi siêu nhẹ nhõm khi biết có một giải pháp. –

+0

Cập nhật câu trả lời của tôi để bao gồm điều này cho bạn. – reddersky

+0

Tôi nhầm lẫn với đối tượng UIWindow. Lấy ứng dụng thử nghiệm đơn giản của tôi, tất cả những gì tôi có là một ứng dụng xem đơn chỉ với một nút và một thanh điều hướng. Tôi đã cố gắng để phụ "cửa sổ" với "self.view" nhưng không phải là chính xác. –

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

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

} 

Các bạn thử cái này ... Nó phù hợp với tôi.Tôi đã thử nhiều cách khác và chỉ có một cách làm việc này.

Các vấn đề liên quan