iPad 3.2 и [MPMoviePlayerController setFullScreen:] не отображаются

#iphone #ios #ipad #mpmovieplayercontroller

#iPhone #iOS #iPad #mpmovieplayercontroller

Вопрос:

У меня есть универсальное приложение, которое воспроизводит фильмы из Интернета. Он должен поддерживать 3.1.x, а также 4.x.

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

Вот как я готовлю проигрыватель к удаленному воспроизведению фильма:

 - (void)registerForMovieNotifications {
    //for 3.2 devices and above
    if ([moviePlayer respondsToSelector:@selector(loadState)]) {
        LOG(@"moviePlayer responds to loadState, this is a 3.2  device");

        //register the notification that the movie is ready to play
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(moviePlayerLoadStateChanged:)
                                                     name:MPMoviePlayerLoadStateDidChangeNotification
                                                   object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(didExitFullScreen:) 
                                                     name:MPMoviePlayerDidExitFullscreenNotification
                                                   object:nil];

        LOG(@"preparing moviePlayer...");
        [moviePlayer prepareToPlay];



       } else {
            //for pre-3.2 devices
            LOG(@"This is a 3.1.x device");

            //register the notification that the movie is ready to play
            [[NSNotificationCenter defaultCenter] addObserver:self
                                                     selector:@selector(moviePreloadDidFinish:)
                                                         name:MPMoviePlayerContentPreloadDidFinishNotification
                                                       object:nil];
        }

        //handle when the movie finished
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(moviePlayBackDidFinish:)
                                                     name:MPMoviePlayerPlaybackDidFinishNotification
                                                   object:nil];
    }
    - (void)readyPlayer {
        if (!moviePlayer) {
            moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
        } else {
            [moviePlayer setContentURL:movieURL];
        }

        [self registerForMovieNotifications];
    }
  

Позже я получаю это уведомление, и оно настраивает просмотр видеопроигрывателя и т.д.

 - (void) moviePlayerLoadStateChanged:(NSNotification*)notification {
    LOG(@"3.2/4.x - moviePlayerLoadStateChanged:");
    //unless state is unknown, start playback
    if ([moviePlayer loadState] != MPMovieLoadStateUnknown) {
        //remove observer
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                        name:MPMoviePlayerLoadStateDidChangeNotification
                                                      object:nil];

        //set the frame of the movie player to match
        self.view.autoresizesSubviews = YES;

        [[moviePlayer view] setFrame:self.view.bounds];
        [[moviePlayer view] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
        [[moviePlayer view] setAutoresizesSubviews:YES];

        //add movie player as a subview
        [self.view addSubview:moviePlayer.view];
        [moviePlayer setFullscreen:YES];

        //play the movie
        [moviePlayer play];

    }
}
  

И фильм воспроизводится. Это отлично работает на iPhone 4.2, 4.3, iPad 4.2, 4.3, но на iPad 3.2 происходит сбой. Фильм воспроизводится, но все, что я получаю, это черный экран.

Если я удалю [moviePlayer setFullscreen:YES] вызов, я получу видимый воспроизводимый фильм в версии 3.2, однако он не «полноэкранный», и поэтому на нем нет кнопки «Готово», и у меня нет возможности отключить экран.

Я бы хотел получить некоторую помощь в том, что здесь происходит. Спасибо!

Комментарии:

1. Жаль, что у меня нет устройства под управлением 3.2, чтобы протестировать это для вас. Похоже, что это может быть ошибка в 3.2. Вы пробовали вызывать setFullscreen:animated: вместо этого, на всякий случай?

2. Удалите всю обработку просмотра из обработчика уведомлений. Остается только метод воспроизведения MoviePlayer. Сделайте это для просмотра ранее. hth

3. @Nathan — да, я пробовал это 🙂

Ответ №1:

Я смог прийти к приемлемому решению, но я все еще чувствую, что это может быть ошибкой.

Если я пропущу вызов setFullScreen и вместо этого просто вручную установлю controlStyle значение MPMovieControlStyleFullScreen , то это даст мне в основном правильное представление (панель инструментов находится примерно на 40 пикселей ниже, чем нужно).

Затем я могу нажать кнопку «Готово», которая запускает moviePlayer:didFinishPlaying обратный вызов.

Итак, это воняет, теперь у меня в моем коде вонючая if 3.2 ветвь логики, но, надеюсь, большинство людей все равно будут на 4.0.