2010-07-13 32 views
22

Tôi gặp rất nhiều sự cố khi hiển thị phim toàn màn hình trong ứng dụng iPad của mình và sau đó cho phép người dùng loại bỏ nó bằng nút Xong hoặc "un-fullscreen" trên các nút điều khiển trình phát.Hiển thị và loại bỏ toàn màn hình MPMoviePlayerController trong iOS 3.2 (iPad)

Ban đầu tôi đang sử dụng MPMoviePlayerViewController cho bản trình chiếu phim, nhưng tôi đã không nhận được thông báo toàn màn hình nhập/thoát từ đối tượng MPMoviePlayerController của mình, vì vậy tôi đã chuyển sang tự làm.

Tôi có thể làm phim xuất hiện toàn màn hình (mặc dù quá trình chuyển đổi) nhưng khi nhấn nút "Xong" hoặc "không có toàn màn hình", người chơi sẽ không thực hiện thao tác nào. Tôi đã đăng mã của tôi dưới đây:

- (void)startPlayingMovieWithURLString:(NSString *)movieURLString { 
    // I get all of these callbacks **EXCEPT** the "willExitFullScreen:" callback. 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullScreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullScreen:) name:MPMoviePlayerWillExitFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishPlayback:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 

    [self.moviePlayerController setContentURL:someExistingURL]; 

     // "self" is a UIViewController subclass, and is presented as a "fullscreen" modal view controller from its parent 
     // I'm setting the movie player's view's frame to take up the full rectangle of my view controller, but really I want the movie to be completely removed when the user presses "done" (that is, removed from the view hierarchy). Not sure when/where to do this. 
    self.moviePlayerController.view.frame = self.view.frame; 
    [self.view addSubview:self.moviePlayerController.view]; 
    [self.moviePlayerController setFullscreen:YES animated:YES]; 

} 

Và đây là mã cho callback didFinish tôi

- (void)didFinishPlayback:(NSNotification *)notification { 
     // This ends up recursively telling the player that playback ended, thus calling this method, thus…well you get the picture. 
     // What I'm trying to do here is just make the player go away and show my old UI again. 
    [self.moviePlayerController setFullscreen:NO animated:YES]; 
} 

Vì vậy, rõ ràng là tôi đang làm một cái gì đó sai nhưng tôi đã được lên và xuống các tài liệu hướng dẫn và tôi không thể tìm ra cách làm cho bộ phim biến mất. Tôi nghĩ nó sẽ trực quan hơn thế này. Tôi đang làm gì sai?

Trả lời

66

Dưới đây là cách các sự kiện -> thông báo làm việc:

  • tài ép 'Xong' nút

    • MPMoviePlayerWillExitFullscreenNotification
    • MPMoviePlayerDidExitFullscreenNotification
  • tài ép 'Để lại toàn màn hình' nút trên giao

    • MPMoviePlayerWillExitFullscreenNotification
    • MPMoviePlayerDidExitFullscreenNotification
    • Lưu ý rằng phát lại không chỉ dừng lại
  • Movie đạt cuối

    • MPMoviePlayerPlaybackDidFinishNotification với MPMoviePlayerPlaybackDidFinishReasonUserInfoKey thiết lập để MPMovieFinishReasonPlaybackEnded
    • Nếu bạn gọi setFullscreen:NO animated:YES trên dụ MoviePlayerController của bạn từ thông báo này, sau đó bạn sẽ nhận được thông báo WillExitDidExit.
    • Lưu ý rằng bạn không nhận được thông báo PlaybackDidFinish khi người dùng nhấn các nút Xong hoặc Rời khỏi chế độ toàn màn hình.

Vì vậy, thông thường, nếu bạn muốn thoát khỏi quan điểm của MoviePlayer, bạn cần phải đặt [self.moviePlayerController.view removeFromSuperview] trong xử lý DidExitFullscreen thông báo. WillExitFullscreen quá sớm.

Dưới đây là mã của tôi:

- (void)willEnterFullscreen:(NSNotification*)notification { 
    NSLog(@"willEnterFullscreen"); 
} 

- (void)enteredFullscreen:(NSNotification*)notification { 
    NSLog(@"enteredFullscreen"); 
} 

- (void)willExitFullscreen:(NSNotification*)notification { 
    NSLog(@"willExitFullscreen"); 
} 

- (void)exitedFullscreen:(NSNotification*)notification { 
    NSLog(@"exitedFullscreen"); 
    [self.movieController.view removeFromSuperview]; 
    self.movieController = nil; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void)playbackFinished:(NSNotification*)notification { 
    NSNumber* reason = [[notification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey]; 
    switch ([reason intValue]) { 
     case MPMovieFinishReasonPlaybackEnded: 
      NSLog(@"playbackFinished. Reason: Playback Ended");   
       break; 
     case MPMovieFinishReasonPlaybackError: 
      NSLog(@"playbackFinished. Reason: Playback Error"); 
       break; 
     case MPMovieFinishReasonUserExited: 
      NSLog(@"playbackFinished. Reason: User Exited"); 
       break; 
     default: 
      break; 
    } 
    [self.movieController setFullscreen:NO animated:YES]; 
} 

- (void)showMovie { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullscreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullscreen:) name:MPMoviePlayerWillExitFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enteredFullscreen:) name:MPMoviePlayerDidEnterFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 

    NSURL* movieURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"tron" ofType:@"mov"]]; 
    self.movieController = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; 
    self.movieController.view.frame = self.view.frame; 
    [self.view addSubview:movieController.view]; 
    [self.movieController setFullscreen:YES animated:YES]; 
    [self.movieController play]; 
} 
+1

Điều này hữu ích và tôi có thể thoát chế độ toàn màn hình ngay khi người dùng nhấn xong, tuy nhiên -playbackFinished: gọi lại không bao giờ được thực hiện cho tôi và tôi không thể cho cuộc sống của tôi tìm ra lý do tại sao không. Bạn có biết bất kỳ lý do nào tại sao điều này có thể xảy ra không? – jbrennan

+0

Ngay cả khi phim phát đến hết? Lạ thật, tôi chưa bao giờ gặp phải điều đó. –

+3

nếu MPMoviePlayerDidExitFullscreenNotification được gọi là cả khi chạm vào "Xong" và khi thoát toàn màn hình, làm sao bạn biết cái nào được gọi? Có lẽ người dùng chỉ thoát toàn màn hình trong trường hợp bạn không muốn xóa chế độ xem mà tôi đoán. –

0

Yes. Thật tuyệt. Có những thông báo thực sự được đề cập ở trên ...

Tuy nhiên, không có MPMoviePlayerPlaybackWillFinishNotification somewhy !!! Đó thực sự là một vấn đề.

Khi bạn gọi trình xem phim như phương thức (không có vấn đề mà các phương pháp sau sử dụng presentViewController/presentModalViewController/presentVideoController), nếu bạn định nghĩa .fullScreen = YES, nó không mong đợi để gọi MPMoviePlayerWillExitFullscreenNotification thông báo ở tất cả (rõ ràng, bởi vì nó không phải là cosidering chúng tôi nhập/thoát khỏi toàn màn hình, nhưng chỉ trình bày/loại bỏ bộ điều khiển).

Nhưng thực sự không có bất kỳ thông báo nào mà video sắp kết thúc và đóng. Điều đó là cần thiết (ngoài bất kỳ tình huống nào khác có thể) để nắm bắt thời điểm khi việc chuyển đổi loại bỏ được bắt đầu. (Quá trình chuyển đổi, tất nhiên, bắt đầu trước MPMoviePlayerPlaybackDidFinishNotification được gọi). Đồng thời, ứng dụng: supportedInterfaceOrientationsForWindow: cho bộ điều khiển được hiển thị trước đó được gọi trước thông báo, và không có cách nào để nói AppDelegate rằng bộ điều khiển hiện tại của chúng ta phải được hiển thị trong một hướng khác. Vì vậy, kể từ khi video của tôi là toàn màn hình và cũng không có bất kỳ điều khiển hiển thị (đây là loại giới thiệu, vì vậy tôi chỉ cho đến khi nó kết thúc) giải pháp của tôi là chỉ để có một bộ đếm thời gian kiểm tra tất cả các đánh dấu ngắn (0,1 giây) vị trí hiện tại của video là ... và nó gần đến mức kết thúc, thì đây là thời điểm cho thông báo của riêng tôi.

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