AVPlayerViewController支持横屏设置

本文针对iOS项目中的视频播放需求,介绍了使用AVPlayerViewController时遇到的问题及解决方案,包括全屏播放模式调整、视图尺寸适配及播放控制等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

针对项目中出现视频播放需求,简单的视频播放功能,可以使用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的使用,下一篇文章将会进行讲解;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值