2012-09-15 57 views
0

我有一個應用程序與根標籤欄控制器。 「主視圖」是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上出現,並且爲了後代而被存檔。

乾杯。

回答

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%確定爲什麼會發生這種情況,因爲在顯示模態視圖控制器時會出現各種各樣的情況。

底線可能是我應該首先做到這一點,作爲延遲加載範例的一部分,而不是試圖將控制器保留在內存中。