`
zl4393753
  • 浏览: 332572 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Dismissing MPMoviePlayerViewController the right way

 
阅读更多
If you have used the MPMoviePlayerViewController to play videos in iOS, chances are you have gotten a little frustrated by its rigidness. A couple of issues I personally encountered were:

When presented modally, the view controller did not respect the modal transition style I had chosen for it.
When the video finished playing, the view controller dismissed itself automatically. I wanted it to remain visible until the user pressed the Done button.
A couple of hours of browsing for the solution to no avail, I decided to try out sort of a hack, which turned out to work great.


The trick is to remove the MPMoviePlayerViewController instance from the MPMoviePlayerPlaybackDidFinishNotification notification observers, and instead handle it yourself. Seems like this view controller listens to this notification and auto dismisses itself when it’s fired.

In my application, I present a thumbnail of the video. When touched, the video is played.

- (void)playVideo:(NSString*)aVideoUrl
{
    // Initialize the movie player view controller with a video URL string
    MPMoviePlayerViewController *playerVC = [[[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:aVideoUrl]] autorelease];

    // Remove the movie player view controller from the "playback did finish" notification observers
    [[NSNotificationCenter defaultCenter] removeObserver:playerVC
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:playerVC.moviePlayer];

    // Register this class as an observer instead
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(movieFinishedCallback:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:playerVC.moviePlayer];

    // Set the modal transition style of your choice
    playerVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

    // Present the movie player view controller
    [self presentModalViewController:playerVC animated:YES];

    // Start playback
    [playerVC.moviePlayer prepareToPlay];
    [playerVC.moviePlayer play];
}


In the code above, an instance of MPMoviePlayerViewController is created, and then removed from the observers of the MPMoviePlayerDidFinishNotification immediately; in its place, the current class is added as an observer, with a selector named movieFinishedCallback: (described below).

In addition, the modalTransitionStyle property of the view controller is set. The documentation suggests you to use the presentMoviePlayerViewControllerAnimated method to present it, in order to use the standard movie player transition. But if you want to use different transition, you must use the regular presentModalViewController method.

Back to the observer notification. Now that the view controller is no longer an observer, it won’t dismiss itself, ever, even if the Done button is pressed. So you must implement the code to dismiss it.

- (void)movieFinishedCallback:(NSNotification*)aNotification
{
    // Obtain the reason why the movie playback finished
    NSNumber *finishReason = [[aNotification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];

    // Dismiss the view controller ONLY when the reason is not "playback ended"
    if ([finishReason intValue] != MPMovieFinishReasonPlaybackEnded)
    {
        MPMoviePlayerController *moviePlayer = [aNotification object];

        // Remove this class from the observers
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                        name:MPMoviePlayerPlaybackDidFinishNotification
                                                      object:moviePlayer];

        // Dismiss the view controller
        [self dismissModalViewControllerAnimated:YES];
    }
}



In my case, my original problem was that I wanted the video to stay visible until the user deliberately pressed the Done button. In the code above, the notification’s “playback finished reason” is examined: if the video playback ended normally, then the notification is ignored; if the video playback ended for another reason (i.e. an error or the user exited), then the view controller is dismissed.

As an added bonus, by dismissing the view controller using the dismissModalViewControllerAnimated: method, the modal transition style set earlier is respected.

The code is kinda messy, but I hope you get the idea. Perhaps it would be desirable to encapsulate this code by extending the MPMoviePlayerViewController class.
分享到:
评论
1 楼 hanmeizhi 2012-07-23  
very useful to me. Thanks

相关推荐

    Bootstrap 4 responsive web design

    Finishing with the right-hand-side content 144 Summary 149 [ iv ] Chapter 7: Of Course, You Can Build a Web App! 151 Alerts in our web app 152 Dismissing alerts 153 Customizing alerts 153 Waiting for ...

    Beyond Compare v4.4.3

    解压:DownloadDevTools.ir ... With the use of a simple as well as useful commands right on the differences that the user is interested as well dismissing of the ones that the user is not.

    visual assist 1709 破解

    Fixed suggestion list dismissing unexpectedly when selecting an item after typing the global scope resolution operator (::). (case=21039) Find References | Find in Results works as expected. (case=...

    滑动解锁屏幕的Lock Ring效果

    The GlowPadView library is basically Android is Lock Ring (way of screen-unlocking and alarm dismissing), but extended and targeted to Honeycomb and later versions of Android. I tried getting it to ...

    ExpandableButtonMenu-弹出menu菜单的效果.zip

     Toast.makeText(MainActivity.this, "Mid pressed and dismissing...", Toast.LENGTH_SHORT).show();  menuOverlay.getButtonMenu().toggle();//切换,此时是关闭子菜单  break;  case LEFT:  Toast...

    IHKeyboardDismissing:自定义视图,在点击该视图时将关闭键盘

    描述 ... 有时可能很难关闭键盘,因为您需要知道哪个视图是第一响应者。 IHKeyboardDismissing减轻了痛苦,并且会简单地遍历其子视图,并在找到它时解散第一个响应者 如何安装 将此添加到您的CocoaPods Podfile。...

    Android代码-一个漂亮流畅可定制的安卓对话框

    Dismissing Dialogs Displaying an Icon Stacked Action Buttons Stacking Behavior Neutral Action Button Callbacks CheckBox Prompts List Dialogs Single Choice List Dialogs Coloring Radio Buttons Multi...

    DOPScrollableActionSheet:多行可滚动操作表

    // DOPScrollableActionSheet view and partial controller for showing and programmatical dismissing // multi scrollable row actionsheet @interface DOPScrollableActionSheet : UIView /* actions = @[@"row...

Global site tag (gtag.js) - Google Analytics