/*
 当在做视频播放器的时候,需要对播放视频的那个view进行旋转操作,当控制中心(上拉的那个菜单)开启旋转屏幕,点击全屏按钮或把手机横屏视图都会全屏,全屏状态下,点击退出全屏按钮或将屏幕旋转到正方向,视图都会退出全屏;如果控制中心关闭旋转屏幕,旋转屏幕不再能用,但进入和退出全屏按钮都是能用的
 在这期间,状态条也是要改变方向的,而且是一直显示的,现在专业做视频的APP都是这样的,下面是怎样实现的屏幕旋转的这一块:
 1. 方案1 :强制旋转屏幕 + SizeClasses这个需要调用私有API(审核可能被拒绝),而且现在私有API有的也不能用了,无法强制退出横屏,所以这个方案不可以;
 2. 方案2 :这就是我即将说的这个,主流视频APP都是这么做的,一开始我做播放器的时候先就差这一点没有解决,蛋疼了好几天,现在终于全都解决了,以后可能会发AVPlayer视频播放的博客,包括音量 . 亮度.手势等等, 不过下一篇我还是会总结一些旋转屏幕时遇到的各种问题;
(首先确定你的程序info.plist添加了要旋转的方向)
 */

@interfaceLRLAVPlayerController ()

//用来播放视频的view
@property(nonatomic,strong)LRLAVPlayerView * avplayerView;
//用来存储这个view的尺寸, 为了模拟存储视频信息的的model
@property(nonatomic,strong)AVPlayerModel* avModel;
//view的高度
@property(nonatomic,assign)CGFloat videoHeight;

@end

@implementation LRLAVPlayerController

//懒加载的方式来获取一个默认的model,用来模拟视频的尺寸;
-(AVPlayerModel *)avModel{
    if (!_avModel) {
        _avModel = [[AVPlayerModelalloc]init];
        _avModel.videoSize = CGSizeMake(SCREEN_WIDTH,200);
    }
    return_avModel;
}

//实例化,一个模拟播放视频的view
-(void)initAVPlayerView{
    self.avplayerView = [[NSBundlemainBundle]loadNibNamed:@"LRLAVPlayerView"owner:selfoptions:nil].lastObject;
    [self.viewaddSubview:self.avplayerView];
    self.videoHeight = SCREEN_WIDTH * (self.avModel.videoSize.height/self.avModel.videoSize.width);
    //使用masonry给视图加限制(autoLayout)
    [self.avplayerViewmas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view).with.offset(40);
        make.left.equalTo(self.view);
        make.right.equalTo(self.view);
        make.height.equalTo(@(self.videoHeight));
    }];
}

//点击进入全屏按钮
- (IBAction)toLaunch:(id)sender {
    [selftoOrientation:UIInterfaceOrientationLandscapeLeft];
}

//点击退出全屏按钮
- (IBAction)toPra:(id)sender {
    [selftoOrientation:UIInterfaceOrientationPortrait];
}

//点击进入,退出全屏,或者监测到屏幕旋转去调用的方法
-(void)toOrientation:(UIInterfaceOrientation)orientation{
    //获取到当前状态条的方向
    UIInterfaceOrientation currentOrientation = [UIApplicationsharedApplication].statusBarOrientation;
    //判断如果当前方向和要旋转的方向一致,那么不做任何操作
    if (currentOrientation == orientation) {
        return;
    }
   
    //根据要旋转的方向,使用Masonry重新修改限制
    if (orientation ==UIInterfaceOrientationPortrait) {
        [self.avplayerViewmas_remakeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.view).with.offset(40);
            make.left.equalTo(self.view);
            make.right.equalTo(self.view);
            make.height.equalTo(@(self.videoHeight));
        }];
    }else{
        //这个地方加判断是为了从全屏的一侧,直接到全屏的另一侧不用修改限制,否则会出错;
        if (currentOrientation ==UIInterfaceOrientationPortrait) {
            [self.avplayerViewmas_remakeConstraints:^(MASConstraintMaker *make) {
                make.width.equalTo(@(SCREEN_HEIGHT));
                make.height.equalTo(@(SCREEN_WIDTH));
                make.center.equalTo(self.avplayerView.superview);
            }];
        }
    }
    //iOS6.0之后,设置状态条的方法能使用的前提是shouldAutorotate为NO,也就是说这个视图控制器内,旋转要关掉;
    //也就是说在实现这个方法的时候-(BOOL)shouldAutorotate返回值要为NO
    [[UIApplicationsharedApplication]setStatusBarOrientation:orientationanimated:NO];
    //获取旋转状态条需要的时间:
    CGFloat duration = [UIApplicationsharedApplication].statusBarOrientation;
    [UIViewbeginAnimations:nilcontext:nil];
    //更改了状态条的方向,但是设备方向UIInterfaceOrientation还是正方向的,这就要设置给你播放视频的视图的方向设置旋转
    //给你的播放视频的view视图设置旋转
    self.avplayerView.transform = [selfgetOrientation];
    [UIViewsetAnimationDuration:duration];
    //开始旋转
    [UIViewcommitAnimations];
}

//根据想要旋转的方向来设置旋转
-(CGAffineTransform)getOrientation{
    //状态条的方向已经设置过,所以这个就是你想要旋转的方向
    UIInterfaceOrientation orientation = [UIApplicationsharedApplication].statusBarOrientation;
    //根据要进行旋转的方向来计算旋转的角度
    if (orientation ==UIInterfaceOrientationPortrait) {
        returnCGAffineTransformIdentity;
    }elseif (orientation ==UIInterfaceOrientationLandscapeLeft){
        returnCGAffineTransformMakeRotation(-M_PI_2);
    }elseif(orientation ==UIInterfaceOrientationLandscapeRight){
        returnCGAffineTransformMakeRotation(M_PI_2);
    }
    returnCGAffineTransformIdentity;
}

//视图控制器实现的方法
-(BOOL)shouldAutorotate{       //iOS6.0之后,要想让状态条可以旋转,必须设置视图不能自动旋转
    returnNO;
}

//这就遇到一个问题,可以手动进行设置旋转的方向,但我们关掉了自动旋转的开关,那么如果我想要既可以手动操作又想自动旋转呢,可现在我已经把自动旋转关了呀,别急,系统提供了一个通知,即使不开启旋转也能监测到旋转
- (void)viewDidLoad {
    [superviewDidLoad];
    self.view.backgroundColor = [UIColorwhiteColor];
    //实例化播放视频的视图,实现在最上边
    [selfinitAVPlayerView];
   
    //获取设备旋转方向的通知,即使关闭了自动旋转,一样可以监测到设备的旋转方向
    [[UIDevicecurrentDevice]beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(orientationChanged:)name:UIDeviceOrientationDidChangeNotificationobject:nil];
}

//获取设备的旋转方向,然后进行判断如何旋转UI
-(void)orientationChanged:(NSNotification *)notification{
    UIDeviceOrientation orientation = [[UIDevicecurrentDevice]orientation];
    //根据监测到的旋转方向,进行旋转
    switch (orientation) {
        caseUIDeviceOrientationPortrait:
            [selftoOrientation:UIInterfaceOrientationPortrait];
            break;
        caseUIDeviceOrientationLandscapeLeft:
            //UIDeviceOrientation和 UIInterfaceOrientation在左右方向上是翻着的
            [selftoOrientation:UIInterfaceOrientationLandscapeRight];
            break;
        caseUIDeviceOrientationLandscapeRight:
            [selftoOrientation:UIInterfaceOrientationLandscapeLeft];
            break;
        default:
            break;
    }
}

@end

视图旋转 AVPlayer视频播放视图旋转相关推荐

  1. 《Cocos Creator游戏实战》旋转循环页视图实现

    旋转循环页视图实现 设置节点 编写代码 在这一节中我们实现一个类似旋转门的页视图(PageView). 运行效果如下: Cocos Creator版本:2.2.0 后台回复"旋转页视图&qu ...

  2. UI一揽子计划 3 (自定义视图、UIViewControllor、屏幕旋转判断和重布局)

    一.UIView自定义视图      因为在实际开发过程中,可能由于繁琐的创建相同的Label.textfield和Button组合,为了实现编程工作的高效率,我们可以自定义视图,并且将它们封装起来. ...

  3. iOS AVPlayer视频播放器

    代码地址如下: http://www.demodashi.com/demo/11168.html 一.运行效果 二.实现过程 ①.创建播放器avPlayer //创建播放器url = [url str ...

  4. 【精】iOS6 及其以上版本自动旋转、手动强制旋转方案及布局适配

    1.布局适配方式 本文不讨论哪种布局适配方式最好,此处使用的是 Masonry 纯代码布局适配.(Masonry 底层就是 AutoLayout 的 NSLayoutConstraint) 2.iOS ...

  5. iOS10 UI教程视图的边界与视图的框架

    iOS10 UI教程视图的边界与视图的框架 iOS10 UI视图的边界 在视图的几何形状中我们提到了视图属性中的一部分属性可以将定义的视图绘制在屏幕上.其中典型的3个属性为边界属性.框架属性以及中心位 ...

  6. iOS手动旋转屏幕、自动旋转屏幕

    有的时候,在iOS下需要实现手动旋转屏幕与自动旋转屏幕的自由切换.比如,在手机竖屏时希望点击按钮使页面横屏,然后当手机屏幕方向发生变化时,页面能正常的契合手机旋转的方向. 1.视图方向旋转:通过vie ...

  7. css3动画旋转360度,CSS3旋转动画(360度旋转、旋转放大、放大、移动) 用法和实例...

    CSS3旋转动画(360度旋转.旋转放大.放大.移动) 用法和实例 Internet Explorer 10.Firefox.Opera 支持 transform 属性. Internet Explo ...

  8. 【iOS开发进阶】-AVPlayer视频播放

    1.AVPlayer介绍 iOS提供了多种方法来实现视频播放,包括MPMoviePlayerController,MPMoviePlayerViewController,AVPlayer,AVPlay ...

  9. MySQL 学习笔记(5)— 视图优缺点、创建视图、修改视图、删除视图

    1. 视图概念 简单来说,视图就是一个预定义的查询语句.视图在许多情况下可以当作表来使用,因此也被称为虚拟表(Virtual Table). 视图与表最大的区别在于它不包含数据,数据库中只存储视图的定 ...

最新文章

  1. 做项目时用到的linux知识
  2. 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析
  3. SharePoint中Tab方式进行内容展现的WebPart
  4. C# WPF动画——小游戏
  5. 上传文件 connection reset
  6. Spring Boot 学习之旅
  7. 100道精选面试题,教你怎样轻松晋级!
  8. Ruby First
  9. php课程设计学生信息管理系统,学生成绩管理系统/学生信息管理系统
  10. 吐血推荐HZHControls:我见过最美的Winform控件库
  11. postman 415错误
  12. 数据分析师等级主要分为哪几个级别?
  13. Git 换行符自动转换
  14. Facade(外观模式) 结构型
  15. 磁盘阵列柜 和存储有什么区别
  16. 【Java类和对象】
  17. 汽车创新人士Rick Tewell晋升为Velodyne Lidar首席运营官
  18. houghpeaks
  19. 华硕启动修复无法自动修复此计算机怎么办,华硕电脑无法启动,自动也修复不了怎么办...
  20. 处理电脑重装后出现的驱动问题

热门文章

  1. Day3-水仙花和三种循环
  2. HTML学习笔记(二)(含vscode配置html_vscode安装方法及常用插件)
  3. Windows lnk有什么作用?怎么打开?
  4. python英文分词库_smallseg---又一个开源python分词库
  5. PHP之stripslashes()函数和htmlspecialchars()函数
  6. skyworth如何连接wifi_教你电视怎么连接无线网络
  7. 网易美术干货,《阴阳师》的角色“设计感”是如何诞生的?
  8. 绕过WAF的XSS语句
  9. 内蒙古大学计算机学院迎新晚会,@内大萌新 | 请记住此刻的笑颜
  10. Oracle数据库插入平方(²)立方(³)等特殊字符