博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一句代码让特定页面支持横竖屏切换
阅读量:5942 次
发布时间:2019-06-19

本文共 1893 字,大约阅读时间需要 6 分钟。

前言

在很多时候,我们开发的APP是只需要支持竖屏的,但是也会遇到一些特殊情况,比如视频全屏播放的时候需要支持其他方向,这种情况处理起来往往比较麻烦。基于这种某些特殊页面需要支持横竖屏切换的需求,简单封装了一个工具类,一句话调用就可以实现页面横竖屏切换。

原理

通过runtime来动态交换方法实现页面横竖屏切换的需求,再通过分类的特性来达到一句话调用。

代码

工具类中代码,利用runtime替换方法的特性,调用的时候把支持的方向修改为全部,这里使用week是防止循环引用,需要注意的是控制器被销毁后需要将方法替换回原来的方法,这样才可以达到只让当前页面支持横竖屏切换而不影响其他页面。

+ (void)needRotationViewController:(UIViewController *)needRotationViewController{    __weak typeof(UIViewController *) weakVC = needRotationViewController;    AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;        IMP originalIMP = method_getImplementation(class_getInstanceMethod([appDelegate class], @selector(application:supportedInterfaceOrientationsForWindow:)));        IMP newIMP = imp_implementationWithBlock(^(id obj, UIApplication *application, UIWindow *window){        if (!weakVC) {            class_replaceMethod([appDelegate class], @selector(application:supportedInterfaceOrientationsForWindow:), originalIMP, method_getTypeEncoding(class_getInstanceMethod([appDelegate class], @selector(application:supportedInterfaceOrientationsForWindow:))));        }        return weakVC ? UIInterfaceOrientationMaskAll : UIInterfaceOrientationMaskPortrait;    });        class_replaceMethod([appDelegate class], @selector(application:supportedInterfaceOrientationsForWindow:), newIMP, method_getTypeEncoding(class_getInstanceMethod([appDelegate class], @selector(application:supportedInterfaceOrientationsForWindow:))));}复制代码

分类中的代码,由于工具类中使用的方法,需要在AppDelegate中实现application:supportedInterfaceOrientationsForWindow方法,每次使用的时候不是很方便,于是利用分类的特性,给AppDelegate增加一个分类,在分类中实现对应的方法,这样就能够达到一句话调用即可让页面支持横竖屏切换。

使用

将工具类和分类一起拖拽到工程中,在需要支持横竖屏切换的控制器页面调用[CLRotationTools needRotationViewController:self]即可。

效果图

总结

虽然代码没有几行,但是也涉及到一些runtime和分类的相关知识。这里实现了APP大部分页面只需要竖屏,某些特殊页面需要横竖屏切换的情况,类似APP大部分页面需要支持横竖屏切换,某些特殊页面只需要竖屏的情况大家可以自行修改。

Demo地址

国际惯例,奉上Demo地址,具体请在github下载 ,如果喜欢,欢迎star。

转载地址:http://ffqtx.baihongyu.com/

你可能感兴趣的文章
debian、ubuntu系统下,常用的下载工具
查看>>
带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例
查看>>
如何解压缩后缀名为zip.001,zip.002等的文件
查看>>
OSGI企业应用开发(十二)OSGI Web应用开发(一)
查看>>
Python 以指定概率获取元素
查看>>
微信公众平台图文教程(二) 群发功能和素材管理
查看>>
关于System.Collections空间
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
Centos 7.5 部署DNS
查看>>
yum简介
查看>>
cp讲解
查看>>
MariaDB Galera Cluster 部署(如何快速部署MariaDB集群)
查看>>
如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
查看>>
论代码审查的重要性
查看>>
「docker实战篇」python的docker爬虫技术-导学(一)
查看>>
如何确定一个网站是用Wordpress开发的
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
wdcp 安装
查看>>
C语言运算符优先级相关问题
查看>>