У меня есть приложение с контроллером панели вкладок в корне. «Домашний вид» представляет собой 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.