Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-在3.0和4.0 OS/SDK上播放视频?_Iphone_Video_Mpmovieplayercontroller - Fatal编程技术网

iPhone-在3.0和4.0 OS/SDK上播放视频?

iPhone-在3.0和4.0 OS/SDK上播放视频?,iphone,video,mpmovieplayercontroller,Iphone,Video,Mpmovieplayercontroller,从3.2版iPhone OS SDK开始,播放视频就完全不同了 因此,我想知道是否有一种方法可以使用兼容的代码(都3.2)全屏播放视频,而无需为这两种情况编写代码 我想我们必须写两个版本的课程来处理视频播放 你的 您可能必须使用#if/#else/#endif块并编译一个通用二进制文件,该文件具有特定O/S级别的正确可执行文件。一种可能性是为此提供一个助手方法。这样,您只需编写一次,并且在任何地方都具有此功能 要编写helper方法本身,您需要检查mpmovieplayervicewcontro

从3.2版iPhone OS SDK开始,播放视频就完全不同了

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

我想我们必须写两个版本的课程来处理视频播放


你的

您可能必须使用#if/#else/#endif块并编译一个通用二进制文件,该文件具有特定O/S级别的正确可执行文件。

一种可能性是为此提供一个助手方法。这样,您只需编写一次,并且在任何地方都具有此功能

要编写helper方法本身,您需要检查mpmovieplayervicewcontroller是否可用。如果是这样,请使用该选项,然后全屏显示该选项。否则,只需使用常规的MPMoviePlayerController

因此,基本框架将是:

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

我基本上按照上面Jeff Kelly的建议在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函数中,我使用相同的技术删除通知

使用这样的预处理器宏将产生执行活动SDK设置的任何操作的效果。当您编译应用程序时,如果您的目标是(比如)3.1.3和更高版本的iPhone SDK,它将使用3.1.3设置编译应用程序,并且两个操作系统版本将使用相同的二进制文件。通常,首选运行时内省(例如,
if([SomeClass respondsToSelector:@selector(someSelector)])
)。