我有一個應用程序與根標籤欄控制器。 「主視圖」是OpenGL中的3D渲染屏幕。有些特定的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];
}
其他唯一的參考,我可以找到一個問題一樣,這是在蘋果支持社區一些歸檔後,在這裏:
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上出現,並且爲了後代而被存檔。
乾杯。