представление модального режима поверх MPMoviePlayerController приводит к сбою, но только в iOS <5.0 - PullRequest
0 голосов
/ 21 января 2012

Итак, вот ситуация (это все в симуляторе):

  • создать контроллер представления.он владеет MPMoviePlayerController и добавляет вид игрока как подпредставление к своему собственному.
  • установить этот vc как rootViewController окна.
  • также в этом виде vc есть кнопка, которая запускает модальныйКонтроллер просмотра (который затемняет фильм) после приостановки проигрывателя фильма.
  • нажмите кнопку, запустите модальный VC, а затем отклоните его.
  • обратите внимание, что приостановленное изображение проигрывателя фильма исчезло(он просто черный).
  • нажмите «play», чтобы возобновить воспроизведение фильма
  • crash

Теперь измените цель сборки с iOS 4.3 на iOS 5.0и это работает безупречно.

Что действительно беспокоит меня, так это то, что это не привело к падению до 4.3 месяц назад.На самом деле, у меня в магазине сейчас есть приложение, для которого это прекрасно работает: http://itunes.apple.com/us/app/es-musica-free/id474811522?mt=8

Итак, я попытался свести это к минимальному примеру, который воспроизводит проблему.

  • Создайте ванильный проект xcode.

  • в вашем AppDelegate.m:



    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        self.window.backgroundColor = [UIColor blackColor];
        [self.window makeKeyAndVisible];

        UIViewController *vc = [[DemoMoviePlayerViewController alloc] init];
        [self.window setRootViewController:vc];
        [vc release];
        vc = nil;

        return YES;
    }

  • DemoMoviePlayerViewController довольно прост.вот файл h:


    #import 
    #import 

    @interface DemoMoviePlayerViewController : UIViewController
    {
        MPMoviePlayerController *moviePlayer_;
    }

    @end

  • и файл m:


    #import "DemoMoviePlayerViewController.h"


    @interface DemoMoviePlayerViewController (InternalMethods)
    - (void)_buttonPressed:(UIButton*)button;
    @end


    @implementation DemoMoviePlayerViewController


    - (id)init
    {
        self = [super init];
        if (self == nil)
        {
            return nil;
        }

        [self setWantsFullScreenLayout:YES];

        NSURL *url = [NSURL URLWithString:@"http://once.unicornmedia.com/now/od/auto/0116d5af-bdc1-456d-a3ac-e3cbe25bac98/c762a821-e583-420c-b798-7b8c66736027/6c0e77e0-6dc4-48d5-9197-26e59271e8dd/content.once"];
        moviePlayer_ = [[MPMoviePlayerController alloc] initWithContentURL:url];

        return self;
    }


    - (void)dealloc
    {
        [moviePlayer_ stop];
        [moviePlayer_ release];
        moviePlayer_ = nil;

        [super dealloc];
    }


    #pragma mark - View lifecycle


    - (void)viewDidLoad
    {
        [super viewDidLoad];

        [[self view] setBackgroundColor:[UIColor redColor]]; // debug

        [[moviePlayer_ view] setFrame:[[self view] bounds]];
        [[moviePlayer_ view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth
                                                  |UIViewAutoresizingFlexibleHeight)];
        [moviePlayer_ setControlStyle:MPMovieControlStyleFullscreen];
        [[moviePlayer_ view] setBackgroundColor:[UIColor greenColor]]; // debug
        [[self view] addSubview:[moviePlayer_ view]];

        // add a button to launch share kit
        UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button setTitle:@"launch modal" forState:UIControlStateNormal];
        [button addTarget:self
                   action:@selector(_buttonPressed:)
         forControlEvents:UIControlEventTouchUpInside];

        [[moviePlayer_ view] addSubview:button];
        [button setFrame:CGRectMake(20, 100, 200, 40)];

        [moviePlayer_ setShouldAutoplay:YES];
        [moviePlayer_ play];
    }


    #pragma mark - internal methods -


    - (void)_dismissModal
    {
        [self dismissModalViewControllerAnimated:YES];
    }


    - (void)_buttonPressed:(UIButton*)button
    {
        if ([moviePlayer_ currentPlaybackRate] == 1.0)
        {
            [moviePlayer_ setShouldAutoplay:NO];
            [moviePlayer_ pause];
        }

        [self performSelector:@selector(_dismissModal) withObject:nil afterDelay:3.0];

        UIViewController *vc = [[UIViewController alloc] init];
        [[vc view] setBackgroundColor:[UIColor blueColor]];
        [self presentModalViewController:vc animated:YES];
        // yeah I know, vc is leaked...
    }


    @end

Так что, очевидно, каким-то образом MPMoviePlayerController каким-то образом может определить, какие егопредставление становится неясным, несмотря на тот факт, что мой контроллер представления не делает ничего необычного в viewWillDisappear или viewDidDisappear.

Опять же, что меня действительно беспокоит, так это то, что, насколько мне известно, это работало просто отлично под 4.3 примерно месяц назад.

...