MPMoviePlayer перестает реагировать на прикосновения

У меня есть приложение с контроллером панели вкладок в корне. «Домашний вид» - это экран с трехмерной визуализацией в OpenGL. Есть определенные 3D-объекты, на которые можно щелкнуть, чтобы отобразить видео. Видео должно быть полноэкранным и плавно появляться и исчезать.

Для этого я заставил HomeViewController создать MPMoviePlayerViewController, присвоил ему URL-адрес и затем представил его из контроллера панели вкладок. (Я бы представил его из HomeViewController, но по какой-то причине он не изменил свою ориентацию должным образом - я уверен, что это связано со всеми пользовательскими 3D-материалами, и я не программировал его, поэтому я просто сделал обходной путь, отображая его с точки зрения старшего.)

(Обратите внимание, что я представляю MPMoviePlayerViewController модально (не используя встроенный PresentModalMovieViewController или что-то еще), потому что Apple заставляет переход быть дурацким сдвигом экрана, а я хотел, чтобы он растворился.)

Теперь все работает нормально. Модальное окно растворяется, воспроизводится видео. Вы можете воспроизвести и приостановить его, перемотать вперед, нажать «Готово», и модальное окно исчезнет. Вуаля.

Теперь возникает совершенно странная ошибка: если вы не коснетесь видеоплеера и не дадите элементам управления исчезнуть (как это происходит через секунду или две), пользователь не сможет вернуть их, нажав. Похоже, что видеоконтроллер перестает реагировать на ввод пользователя после этого затухания. Опять же, он отлично работает, прежде чем они исчезнут. Но после этого мне приходится ждать, пока видео не проиграет полностью (в этот момент модальное окно, по сути, закрывается).

Для справки, вот соответствующий код модального видеоплеера:

-(void) startVideoWithURL:(NSURL *)videoURL {

    if (!self.outsideMoviePlayerViewController) {
        self.outsideMoviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:nil];
    }

    if (videoURL) {

        [self stopAnimation];

        self.outsideMoviePlayerViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        self.outsideMoviePlayerViewController.moviePlayer.contentURL = videoURL;

        [[[AppController instance] getCustomTabBarViewController] presentModalViewController:self.outsideMoviePlayerViewController animated:YES];

        // Move observation of the dismiss from the MoviePlayerViewController to self.
        [[NSNotificationCenter defaultCenter] removeObserver:self.outsideMoviePlayerViewController
                                                        name:MPMoviePlayerPlaybackDidFinishNotification
                                                      object:self.outsideMoviePlayerViewController.moviePlayer];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(movieFinishedCallback:)
                                                     name:MPMoviePlayerPlaybackDidFinishNotification
                                                   object:self.outsideMoviePlayerViewController.moviePlayer];

    }

}

-(void) movieFinishedCallback:(NSNotification *)aNotification {

    // Summary: Restart 3D animation, unregister from notifications, kill the modal video.

    [self startAnimation];

    MPMoviePlayerController *moviePlayer = [aNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:moviePlayer];

    [[[AppController instance] getCustomTabBarViewController] dismissModalViewControllerAnimated:YES];

}

Единственная другая ссылка, которую я смог найти по этой проблеме, - это заархивированная запись в сообществах поддержки Apple, здесь:

https://discussions.apple.com/thread/2141156?start=0&tstart=0

В этой ветке автор проблемы выясняет сам и заявляет, что проблема решена. Вот его объяснение:

Проблема возникает, когда CFRunLoopRunInMode (kCFRunLoopDefaultMode, 0, TRUE). После того, как я перешел на CFRunLoopRunInMode (kCFRunLoopDefaultMode, 0.002, TRUE), элемент управления воспроизведением может появляться / исчезать при нажатии на экран.

К сожалению, я не занимаюсь программированием игры, и никто из моей команды разработчиков не вызывает CFRunLoopRunInMode в любом месте кода. Ближе всего к этому я нашел код анимации (в том же ViewController):

- (void)startAnimation
{
    if (!animating)
    {
        NSLog(@"startAnimation called");
        CADisplayLink *aDisplayLink = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)];
        [aDisplayLink setFrameInterval:animationFrameInterval];
        [aDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        self.displayLink = aDisplayLink;

        animating = TRUE;
    }
}

Если у кого-то есть какие-либо идеи о том, что может быть причиной этого, я был бы признателен. Я подумал, что, по крайней мере, даже если я сам выясню это сегодня вечером, эта проблема может подняться на Stack Overflow и быть заархивирована для потомков.

Ваше здоровье.


person Matt Mc    schedule 15.09.2012    source источник


Ответы (1)


Я понял, что вызвало эту проблему.

Я заметил, что первое видео воспроизводилось, а последующие - нет. Я переместил этот код:

if (!self.outsideMoviePlayerViewController) {
        self.outsideMoviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:nil];
}

Таким образом, создание outsideMoviePlayerViewController происходило внутри следующего блока, например:

if (videoURL) {

        self.outsideMoviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:nil];

        [self stopAnimation];

        self.outsideMoviePlayerViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        self.outsideMoviePlayerViewController.moviePlayer.contentURL = videoURL;

Теперь новый контроллер создается вместо того, чтобы перезапускать контроллер каждый раз, когда я воспроизводил видео. Ошибка исчезла. Я не уверен на 100%, почему это произошло, потому что при отображении контроллера модального представления происходит множество вещей.

Суть в том, что, вероятно, я должен был сделать это в первую очередь как часть парадигмы ленивой загрузки, вместо того, чтобы пытаться сохранить контроллер в памяти.

person Matt Mc    schedule 16.09.2012