2010-04-21 72 views
5

由于3.2 iPhone OS SDK,播放视频确实不同。iPhone - 在3.0和4.0 OS/SDK上播放视频?

所以我想知道是否有一种方法可以使用兼容代码(包括<和> 3.2)全屏播放视频,而无需为两种情况编写代码。

我认为我们将不得不写2个版本我们班的处理视频播放......

你的!

回答

2

我基本上做什么上面杰夫·凯利提出对3.1运行及以上,请注意instancesRespondToSelector电话:后来在

// Initialize a movie player object with the specified URL 
MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; 
if (mp) 
{ 

    // Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayBackDidFinish:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:nil]; 


    //Will only run this code for >= OS 3.2 
    if ([MPMoviePlayerController instancesRespondToSelector:@selector(setFullscreen:animated:)]){ 

     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(moviePlayBackStateDidChange:) 
                name:MPMoviePlayerPlaybackStateDidChangeNotification 
                object:nil]; 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(nowPlayingMovieDidChange:) 
                name:MPMoviePlayerNowPlayingMovieDidChangeNotification 
                object:nil]; 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(moviePlayBackDidFinish:) 
                name:MPMoviePlayerDidExitFullscreenNotification 
                object:nil]; 

     mp.controlStyle = MPMovieControlStyleFullscreen; 


     [mp setScalingMode:MPMovieScalingModeAspectFit]; 

        //change mainMenu here to whatever your parent view is 
     [mp.view setFrame:mainMenu.frame]; 
     [self.view addSubview:mp.view]; 



     [mp setFullscreen:YES animated:NO]; 
    } 
//continue as normal 

,然后moviePlayBackDidFinish函数我使用相同的技术来删除通知。

-1

您可能必须使用#if /#else /#endif块并编译具有适用于特定操作系统级别的正确可执行文件的通用二进制文件。

+2

使用像这样的预处理器宏会产生无论Active SDK设置为什么的效果。当你编译应用程序时,如果你的目标是3.1.3和更高版本的iPhone SDK,它将使用3.1.3设置编译应用程序,并且相同的二进制文件将用于两个操作系统版本。一般来说,运行时自省(例如'if([SomeClass respondsToSelector:@selector(someSelector)])')是首选。 – 2010-04-21 15:33:49

0

一种可能性是为此有一个辅助方法。这样你只需要编写一次,并在任何地方都有这个功能。

要编写助手方法本身,您需要检查MPMoviePlayerViewController是否可用。如果是这样,那么使用它,然后呈现全屏。否则,只需使用常规MPMoviePlayerController。

所以基本框架是:

-(void)playMovie:(NSURL *)movieURL 
{ 
    Class mpVC = NCClassFromString("MPMoviePlayerViewController"); 
    if(mpVC) 
    { 
     // Generate MPPlayerViewController here and use accordingly 
    } 
    else 
    { 
     // Generate MPPlayerController here and use accordingly 
    } 
}