针对项目中出现视频播放需求,简单的视频播放功能,可以使用AVPlayerViewController,在iOS9后废弃了之前的MPMoviePlayer,现在统一使用AVKit下的AVPlayerViewController;
作为第一次使用AVPlayerViewController,总结一些遇到的坑,分享出去;
1.首先是全屏播放问题,由于界面只支持portrait模式,可是看视频是需要Landscape模式的,这样视频进行全屏播放的时候就不能出现横屏的模式,尝试了一下几种解决方式;
- 将需要全屏播放的View,横屏模式打开,这样用户点击全屏按钮的时候,如果会调ViewWillDisappear方法,这样就可以通过在这些视图appear和disappear方法中,手动的置手机横屏,达到想要的效果;
- 寻找点击全屏时会触发的方法,在触发的方法的时候,自己通过手动处理也能达到目的;
- 如果实在找不出解决方法,把app的landScape模式打开,用户再看视频的时候就能出现了;但是其它页面会出错;
在实际的操作中发现,通过代码在viewController中的操作都是无效的;
找遍了所有AVPlayerViewController的API都没有找到点击全屏的触发方法;
经过几番模式,发现用以下的方式可以解决问题:
static NSString * const VIDEO_CONTROLLER_CLASS_NAME_IOS7 = @"MPInlineVideoFullscreenViewController";
static NSString * const VIDEO_CONTROLLER_CLASS_NAME_IOS8 = @"AVFullScreenViewController";
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
if ([[window.rootViewController presentedViewController] isKindOfClass:NSClassFromString(VIDEO_CONTROLLER_CLASS_NAME_IOS7)] ||
[[window.rootViewController presentedViewController] isKindOfClass:NSClassFromString(VIDEO_CONTROLLER_CLASS_NAME_IOS8)])
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
else {
NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
return UIInterfaceOrientationMaskPortrait;}
}
2.在设置AVPlayerViewController的View的frame的时候,发现实际的展示效果和自己本身设的尺寸并不一致,通过下面这行代码可以解决一些问题,但是碰到与约束相关的页面还是会出错,最后通过创建一个单独的Cell来展示AVPlayerViewController的View就没问题了
_moviePlayer.view.translatesAutoresizingMaskIntoConstraints = YES;
3.播放视频的时候不会停止,即使将视频置为nil也不会停止,通过下面这段代码完美解决;
@property(nonatomic,strong)id playbackObserver; /**<检测播放的背景*/
- (void)removeBoundaryTimeObserver {
if (self.playbackObserver) {
[self.moviePlayer.player removeTimeObserver:self.playbackObserver];
self.playbackObserver = nil;
}
}
后记:在使用的时候,顺便研究了一下AVPlayer的使用,下一篇文章将会进行讲解;