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