仿QQ视频全屏界面旋转实现

// 实现效果:界面支持系统自动转屏和点击转屏
//  ViewController.m
//  rotatoTest

//  Copyright © 2016年 yaoyao. All rights reserved.
//  1.关闭系统自动转屏
//  2.获取设备方向,设置转屏,
//  3.点击按钮,设置转屏

#import "ViewController.h"
#import <UIKit/UIKit.h>
#import <CoreGraphics/CoreGraphics.h>

@interface ViewController ()
{
    float width;
    float height;

}
@property (nonatomic,retain)UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {

    /**
     * UIImage 对象
     */
    UIImage *image = [UIImage imageNamed:@"000.jpg"];
    self.imageView.image = image;

    // 设置图片范围
    CGFloat imageH = image.size.height;
    CGFloat imageW = image.size.width;
    CGFloat imageX = 0;
    CGFloat imageY = 0;
    self.imageView.frame = CGRectMake(imageX, imageY, width, 100);
    self.imageView.userInteractionEnabled = YES;
    [self.view addSubview:self.imageView];

    //相当于qq视频上面的全屏按钮
    UIButton *btnL = [UIButton buttonWithType:UIButtonTypeCustom];
    btnL.frame = CGRectMake(20, 20,150, 20);
    [btnL setTitle:@"点击向左横屏" forState:UIControlStateNormal];
    btnL.backgroundColor = [UIColor blueColor];
    [btnL addTarget:self action:@selector(btnLClick) forControlEvents:UIControlEventTouchUpInside];
    [self.imageView addSubview:btnL];

    //相当于qq视频全屏界面上的返回按钮
    UIButton *btnP = [UIButton buttonWithType:UIButtonTypeCustom];
    btnP.frame = CGRectMake(200, 20,100, 20);
    [btnP setTitle:@"点击竖屏" forState:UIControlStateNormal];
    btnP.backgroundColor = [UIColor blueColor];
    [btnP addTarget:self action:@selector(btnPClick) forControlEvents:UIControlEventTouchUpInside];
    [self.imageView addSubview:btnP];

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

//支持旋转(当手动转屏时关闭自动转屏)
-(BOOL)shouldAutorotate
{
    return NO;
}

//支持的方向(亲测:当上个方法返回no时,这个方法依然调用)
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    NSLog(@"supportedInterfaceOrientations调用了");
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;

}

-(void)btnLClick
{
    [[UIApplication sharedApplication]setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:YES];
    CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:duration];
    //在这里设置view.transform需要匹配的旋转角度的大小就可以了。
    self.imageView.transform = CGAffineTransformIdentity;
    self.imageView.transform = CGAffineTransformMakeRotation(M_PI/2.0);
    self.imageView.frame = CGRectMake(0, 0, width, height);
    [UIView commitAnimations];

}

//点击返回竖屏
-(void)btnPClick
{
    [[UIApplication sharedApplication]setStatusBarOrientation:UIDeviceOrientationPortrait   animated:YES];
    CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:duration];
    //在这里设置view.transform需要匹配的旋转角度的大小就可以了。
    self.imageView.transform = CGAffineTransformIdentity;
    self.imageView.transform = CGAffineTransformMakeRotation(0);
    self.imageView.frame = CGRectMake(0, 0, width, 100);
    [UIView commitAnimations];

}

- (void)handleDeviceOrientationDidChange:(UIInterfaceOrientation)interfaceOrientation
{
    //1.获取 当前设备 实例
    UIDevice *device = [UIDevice currentDevice] ;

    /**
     *  2.取得当前Device的方向,Device的方向类型为Integer
     *
     *  必须调用beginGeneratingDeviceOrientationNotifications方法后,此orientation属性才有效,否则一直是0。orientation用于判断设备的朝向,与应用UI方向无关
     *
     *  @param device.orientation
     *
     */

    switch (device.orientation) {
        case UIDeviceOrientationFaceUp:
        {
            NSLog(@"屏幕朝上平躺");

        }

            break;

        case UIDeviceOrientationFaceDown:
            NSLog(@"屏幕朝下平躺");
            break;

            //系統無法判斷目前Device的方向,有可能是斜置
        case UIDeviceOrientationUnknown:
            NSLog(@"未知方向");
            break;

        case UIDeviceOrientationLandscapeLeft:
        {
            NSLog(@"屏幕向左横置");
            [[UIApplication sharedApplication]setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:YES];
            CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
            [UIView beginAnimations:nil context:nil];
            [UIView setAnimationDuration:duration];
            //在这里设置view.transform需要匹配的旋转角度的大小就可以了。
            self.imageView.transform = CGAffineTransformIdentity;
            self.imageView.transform = CGAffineTransformMakeRotation(M_PI/2.0);
            self.imageView.frame = CGRectMake(0, 0, width, height);
            [UIView commitAnimations];

        }

            break;

        case UIDeviceOrientationLandscapeRight:
        {
            NSLog(@"屏幕向右橫置");
            [[UIApplication sharedApplication]setStatusBarOrientation:UIDeviceOrientationLandscapeRight animated:YES];
            CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
            [UIView beginAnimations:nil context:nil];
            [UIView setAnimationDuration:duration];
            //在这里设置view.transform需要匹配的旋转角度的大小就可以了。
            self.imageView.transform = CGAffineTransformIdentity;
            self.imageView.transform = CGAffineTransformMakeRotation(-M_PI/2.0);
            self.imageView.frame = CGRectMake(0, 0, width, height);
            [UIView commitAnimations];
        }
            break;

        case UIDeviceOrientationPortrait:
        {
            NSLog(@"屏幕直立");
            [[UIApplication sharedApplication]setStatusBarOrientation:UIDeviceOrientationPortrait animated:YES];
            CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
            [UIView beginAnimations:nil context:nil];
            [UIView setAnimationDuration:duration];
            //在这里设置view.transform需要匹配的旋转角度的大小就可以了。
            self.imageView.transform = CGAffineTransformIdentity;
            self.imageView.transform = CGAffineTransformMakeRotation(0);
            self.imageView.frame = CGRectMake(0, 0, width, 100);
            [UIView commitAnimations];

        }
            break;

        case UIDeviceOrientationPortraitUpsideDown:
            NSLog(@"屏幕直立,上下顛倒");
            break;

        default:
            NSLog(@"无法辨识");
            break;
    }

}

-(void)viewDidAppear:(BOOL)animated
{

    /**
     *  开始生成 设备旋转 通知
     */
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

    /**
     *  添加 设备旋转 通知
     *
     *  @param handleDeviceOrientationDidChange: handleDeviceOrientationDidChange: description
     *
     *  @return return value description
     */
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(handleDeviceOrientationDidChange:)
                                                 name:UIDeviceOrientationDidChangeNotification
                                               object:nil
     ];

}

-(void)viewDidDisappear:(BOOL)animated
{
    /**
     *  销毁 设备旋转 通知
     *
     *  @return return value description
     */
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIDeviceOrientationDidChangeNotification
                                                  object:nil
     ];

    /**
     *  结束 设备旋转通知
     *
     *  @return return value description
     */
    [[UIDevice currentDevice]endGeneratingDeviceOrientationNotifications];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma 懒加载

- (UIImageView *)imageView
{
    if (!_imageView) {
        _imageView = [[UIImageView alloc] init];
    }
    return _imageView;
}

@end
时间: 2024-11-05 06:19:00

仿QQ视频全屏界面旋转实现的相关文章

WebView中的视频全屏的相关操作

最近工作中,基本一直在用WebView,今天就把它整理下: WebView 顾名思义,就是放一个网页,一个看起来十分简单,但是用起来不是那么简单的控件. 首先你肯定要定义,初始化一个webview,其实网上的例子很多,我这里就简单的把一些WebView 中可能会用到的的很重要的属性以及支持全屏播放视频该怎么实现的代码粘出来,直接放到项目中去就行了 <span style="white-space:pre"></span><pre name="co

Android解决WebView的定位功能、视频全屏播放、下载功能、页面Url的处理、进度条处理

解决WebView的定位功能.视频全屏播放.下载功能.页面Url的处理.进度条处理 事先说明: 定位功能在安卓6.0需要用户手动确认权限后才能使用 若需在安卓6.0适配WebView的定位功能,则需要在WebView中手动增加用户权限访问 详细可百度安卓6.0权限管理系统,或者采用第三方封装好的权限管理类进行编写(如Bmob) 如果对内容不理解的话,可参考最后的整个类的代码 如果对BaseActivity这个抽象类不理解的话,可以查看下面一篇文章对BaseActivity的介绍 步骤一:webv

android4.4上全屏界面实现禁止状态栏下拉

附上我改动的方法:PhoneWindowManager.java里面的改动 --- a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -2863,7 +2863,9 @@ public cla

KK上全屏界面如何实现禁止状态栏下拉?

[SOLUTION] Google从KK开始增加了状态栏透明以及全屏 界面有通知可以下拉状态栏的设计,而这个设计出现的隐患是设置了FULL_SCREEN的界面是无法禁止状态栏下拉的,这样对一些工程测试app可能会造 成一定的影响,但是以google默认的设计,应用端无法修改此设计来满足自己的需求. MTK 内部已经开发提供新的接口来实现全屏界面禁止下拉状态栏,如果贵司的代码还没有这部分逻辑,请参考如下: 1. frameworks\base\core\java\android\view\View

手机影音第九天,控制视频全屏播放与退出全屏播放,音量调节按钮来控制视频音量与静音的实现

代码以托管到码云,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 一.视频全屏播放与退出全屏 系统默认的videoview类,没有调整大小的方法,因此需要自定义一个类,继承videoview,然后重写里面的三个构造方法,再自定义一个调整视频播放页面大小的方法. 1.布局文件 同时,在视频播放的布局文件中,videoview布局要引用上面自定义的类. <?xml version="1.0" encoding=&

x5webview 自定义全屏界面

集成X5WEBVIEW可以选择全屏模式为标准全屏还是x5全屏,而不设置默认为false. 首先看看标准全屏的基本设置, if (webView.getX5WebViewExtension() != null) { Bundle data = new Bundle(); data.putBoolean("standardFullScreen", false);// true表示标准全屏,false表示X5全屏:不设置默认false, data.putBoolean("suppo

Android webview 退出时关闭声音 4.视频全屏 添加cookie

全屏问题,可以参考 http://bbs.csdn.net/topics/390839259,点击 webView = (WebView) findViewById(R.id.webView); videoview = (FrameLayout) findViewById(R.id.video_view); chromeClient = new WebChromeClient() { // 播放网络视频时全屏会被调用的方法 @Override public void onShowCustomVi

android--------自定义视频控件(视频全屏竖屏自动切换)

android播放视频也是常用的技术,今天分享一个自定义视频控件,支持自定义控制 UI,全屏播放, 可以实现自动横竖屏切换的控件,跟随手机的位置而,重力感应自动切换横竖屏. 效果图:   代码下载Github:https://github.com/DickyQie/android-video 原文地址:https://www.cnblogs.com/zhangqie/p/8487734.html

Focusky教程 | 视频全屏播放

(Focusky动画演示大师简称为"FS软件")首先,要使路径比例跟电脑的显示屏比例一致,才能保证帧里的内容能够全屏播放. 故在设计内容前,可根据电脑显示屏的比例来选择合适的显示比例.如下图 [图1▲] 然后, 导入视频(或者添加在线视频.录屏添加视频), 将视频拉大至帧大小, 这样, 播放视频时便能够全屏播放了. [图2▲] 原文地址:https://www.cnblogs.com/focusky/p/10129795.html