二、MPMoviePlayerViewController视频视图控制器
如果你很熟悉MVC,你可能会觉得MPMoviePlayerController的设计模式非常蹩脚,强行要求你将控制器的视图分离出来加在另外的UI上,徒增的代码逻辑的混乱,那么你想的没错,MPMoviePlayerViewController可能就是为了解决这个问题。
MPMoviePlayerViewController将视图封装在了一起,其中有一个成员对象是MPMoviePlayerController类型,类似C++中的has-a逻辑,我们只需要对MPMoviePlayerViewController进行的简单的初始化后,对其中MPMoviePlayerController进行其他配置,之后通过模态跳转切换控制器即可。
方法如下:
- (instancetype)initWithContentURL:(NSURL *)contentURL;
初始化方法,和上面类似
@property (nonatomic, readonly) MPMoviePlayerController *moviePlayer;
播放器对象
- (void)presentMoviePlayerViewControllerAnimated:(MPMoviePlayerViewController *)moviePlayerViewController;
- (void)dismissMoviePlayerViewControllerAnimated;
viewController的模态跳转方法,也可以通过导航push与pop
代码示例如下:
@interface ViewController2 ()
@property(nonatomic,strong)MPMoviePlayerController * movie;
@property(nonatomic,strong)MPMoviePlayerViewController * viewController;
@end
@implementation ViewController2
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self playMovie:@"111"];
}
-(void)playMovie:(NSString *)fileName{
//视频文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"mp4"];
//视频URL
NSURL *url = [NSURL fileURLWithPath:path];
//视频播放对象
_viewController = [[MPMoviePlayerViewController alloc]initWithContentURL:url];
_movie=_viewController.moviePlayer;
// 注册一个播放结束的通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(myMovieFinishedCallback:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:_movie];
_movie.fullscreen=YES;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[_movie play];
[self presentViewController:_viewController animated:YES completion:nil];
}
-(void)myMovieFinishedCallback:(NSNotification*)notify
{
//视频播放对象
MPMoviePlayerController* theMovie = [notify object];
//销毁播放通知
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:theMovie];
[theMovie.view removeFromSuperview];
}