2012-09-15 2 views
0

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

Для этого я сделал 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; 
    } 
} 

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

Cheers.

ответ

0

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

Я заметил, что первое видео играло, а последовательных - нет.Я переехал этот код:

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%, почему это произошло, потому что есть множество вещей, которые возникают при отображении контроллера модального представления.

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

Смежные вопросы