2011-09-26 55 views
1

我正在開發iOS SDK 4.3。 我有一個水平滾動的分頁畫廊,可以顯示來自遠程供稿的圖像或視頻。對於分頁視圖,我使用公開的ATPagingView:頁面與TableViewCells類似地重複使用。但是對於視頻我使用的是單一的MPMoviePlayerController,其.view財產我分配到幾個頁面作爲一個子視圖(我知道,我知道...):MPMoviePlayerController不會加載滾動畫廊中的第一個視頻

moviePlayerController = [[MPMoviePlayerController alloc] init]; 
moviePlayerController.repeatMode = MPMovieRepeatModeNone; 
moviePlayerController.controlStyle = MPMovieControlStyleEmbedded; 
moviePlayerController.shouldAutoplay = false; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieLoadStateChangeAction:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil]; 

你可以看到我已經註冊用於MoviePlayer事件LoadState通知。 當一個新的頁面進入屏幕,我開始加載視頻如果需要的話:

- (void)currentPageDidChangeInPagingView:(ATPagingView *)pagingView 
{ 
if (pagingView.currentPageIndex < 0) 
    return; 

NSLog(@"currentPageDidChangeInPagingView"); 
GalleryPageView *currentPage = (GalleryPageView *)[pagingView viewForPageAtIndex:pagingView.currentPageIndex]; 
if (![currentPage.gestureRecognizers count]) { 
    UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(resetZoom)]; 
    recognizer.numberOfTapsRequired = 2; 
    [currentPage.zoomView addGestureRecognizer:recognizer]; 
    recognizer.delegate = self; 
    [recognizer release]; 
} 

moviePlayButton.hidden = YES; 

[activityView stopAnimating]; 
FeedItem *feedItem = (FeedItem *)[dataRoot objectAtIndex:pagingView.currentPageIndex]; 
if (feedItem.contentType == FeedContentTypeMovie) { 
    moviePlayerController.contentURL = [NSURL URLWithString:feedItem.movieUrl]; 
    [moviePlayerController prepareToPlay]; 
    [activityView startAnimating]; 
} 

現在,IFF的第一頁面包含一個視頻,即使是在我稱之爲moviePlayerController.prepareToPlay,它不會加載:無loadState事件被觸發。下面的頁面可以按預期工作。 我試圖在MPlayerController初始化時預加載一個固定的視頻,但是在這種情況下,固定視頻被正確加載(MPMovieLoadState == 3),而第一頁上的視頻導致MPMovieLoadStateUnknown發生更改。

電影的URL是正確的。 當我從第2頁滾回到第1頁時,第一個視頻被加載(MPMovieLoadState == 3),但它不顯示。

你有什麼建議調查?共享視圖體系結構如此可怕嗎?畢竟,它適用於以下頁面。 prepareToPlay有沒有任何已知的奇怪行爲?例如,如果視圖被任何人「虐待」,MPC是否可能會生氣,然後它拒絕加載內容?你還會怎麼解釋MPMovieLoadStateUnknown?我很確定沒有其他的MPC的鬼實例搞亂了(我讀過它可能是一個問題)。

謝謝你,對於這篇長文章感到抱歉。

回答

1

我不得不最終使用AVPlayer,因爲在我的代碼中與此非常相似。

+0

現在沒時間做,但肯定值得一試。我將不得不更改通知模型以符合鍵值觀察:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html – AndreaG

0

我有同樣的問題。在iOS7這不會發生,但在iOS 6中LoadState的是3,這是不是在考慮:收到MPMoviePlayerLoadStateDidChangeNotification所以當

enum { 
    MPMovieLoadStateUnknown  = 0, 
    MPMovieLoadStatePlayable  = 1 << 0, 
    MPMovieLoadStatePlaythroughOK = 1 << 1, // Playback will be automatically started in this state when shouldAutoplay is YES 
    MPMovieLoadStateStalled  = 1 << 2, // Playback will be automatically paused in this state, if started 
}; 
typedef NSInteger MPMovieLoadState; 

我自動播放設置爲NO並使用prepareToPlay等待通知玩,打之前,我檢查LoadState的是這樣的:

if (self.moviePlayerC.loadState & MPMovieLoadStatePlayable || self.moviePlayerC.loadState & MPMovieLoadStatePlaythroughOK) 

也許在iOS6的LoadState的是可以同時包含幾個狀態的按位值。