iOS 面向协议封装全屏旋转功能
关于使用面向协议来封装功能的实战可以参考我上篇文章 【iOS 面向协议方式封装空白页功能】,这里就不再赘述,我们直接进入使用阶段吧。 本篇文章只有一个目的,那就是只要遵守协议,一行代码随意切换全屏~
如果对面向协议有疑问的同学可以看下我之前的两篇文章
开源库
Name |
Link |
---|---|
GitHub |
LXFProtocolTool |
Wiki |
Wiki首页 |
本文 Demo |
LXFFullScreenable |
使用Cocoapods的方式来安装即可
pod 'LXFProtocolTool/FullScreenable'
一、配置
- 若项目支持横屏(Landscape)则跳过此配置步骤
- 若项目只支持竖屏(Portrait)的话需要在
AppDelegate
中实现如下方法
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if UIApplication.shared.lxf.allowRotation { // 可旋转屏幕时所支持的方向
return UIInterfaceOrientationMask.landscape
}
return .portrait
}
二、使用案例
方法与属性的调用都需要命名空间加上
lxf
,如isFullScreen
->lxf.isFullScreen
isFullScreen : 获取当前遵守协议者是否为全屏状态
func switchFullScreen(
isEnter: Bool? = nil,
specifiedView: UIView? = nil,
superView: UIView? = nil,
config: FullScreenableConfig? = nil,
completed: ((_ isFullScreen: Bool)->Void)? = nil
)
Name |
Type |
Desc |
---|---|---|
isEnter |
Bool? |
是否进入全屏 |
specifiedView |
UIView? |
指定即将全屏的视图 |
superView |
UIView? |
作为退出全屏后specifiedView的父视图 |
config |
FullScreenableConfig? |
配置 |
completed |
((_ isFullScreen: Bool)->Void)? |
进入/退出 全屏后的回调 |
当
switchFullScreen
的调用者为UIView
时,如果specifiedView
为nil
会自动填写,superView
也是如此
switchFullScreen
方法不推荐直接使用,不过当遵守协议者为UIViewController
时,可以通过使用默认参数来切换屏幕方向lxf.switchFullScreen()
lxf_FullScreenable_1
以下分两种情况说明
UIViewController
func enterFullScreen(
specifiedView: UIView,
config: FullScreenableConfig? = nil,
completed: FullScreenableCompleteType? = nil
)
func exitFullScreen(
superView: UIView,
config: FullScreenableConfig? = nil,
completed: FullScreenableCompleteType? = nil
)
以上两个方法是对
switchFullScreen
的抽离,使调用时对参数的传递更加清晰
1、遵守协议 FullScreenable
class LXFFullScreenableController: UIViewController, FullScreenable { }
2、指定视图进入全屏
lxf.enterFullScreen(specifiedView: cyanView)
3、指定视图退出全屏,并添加到当前控制器的view
上
lxf.exitFullScreen(superView: self.view)
UIView
func enterFullScreen(
specifiedView: UIView? = nil,
config: FullScreenableConfig? = nil,
completed: FullScreenableCompleteType? = nil
)
func exitFullScreen(
superView: UIView? = nil,
config: FullScreenableConfig? = nil,
completed: FullScreenableCompleteType? = nil
)
以上两个方法是对
switchFullScreen
的抽离,使调用时对参数的传递更加清晰
1、遵守协议 FullScreenable
class LXFFullScreenView: UIButton, FullScreenable { }
let cyanView = LXFFullScreenView()
2、进入全屏
cyanView.lxf.enterFullScreen()
3、退出全屏
cyanView.lxf.exitFullScreen()
这里是对遵守了
FullScreenable
协议的视图进入全屏切换,由于代码内部已经经过自动视图填写,所以直接调用相应的方法即可,当然也可以自己指定specifiedView
和superView
lxf_FullScreenable_2
三、FullScreenableConfig说明
上述的方法都有一个
config
参数,默认为nil,即为默认配置
相关属性说明
Name |
Type |
Desc |
Default |
---|---|---|---|
animateDuration |
Double |
进入/退出 全屏时的旋转动画时间 |
0.25 |
enterFullScreenOrientation |
UIInterfaceOrientation |
进入全屏时的初始方向 |
landscapeRight |
这里我们把动画时间设置为1s
,初始方向为左
后来看看效果
FullScreenableConfig(
animateDuration: 1,
enterFullScreenOrientation : .landscapeLeft
)
cyanView.lxf.enterFullScreen(config: diyConfig)
cyanView.lxf.exitFullScreen(config: diyConfig)
lxf_FullScreenable_3
结语
到这里相关的说明已罗列完毕,有什么不清楚的可以下载Demo看看,或者在文章下方留言提问
LXFProtocolTool 主要是通过协议的方式来方便快捷地实现一些的实用功能,除了本文提及的全屏旋转功能外还有其它实用功能的封装,具体内容可以到 Wiki首页 查找。如果你有什么想实现的功能也可以提出来,喜欢的就给个Star鼓励下我吧 ? ? ?,感谢支持!
- 【专业技术】8大你不得不知的Android调试工具
- 数据刷新中的并行改进(二) (r5笔记第76天)
- Spring【AOP模块】就这么简单
- 【专业技术】如何写出优美的C 代码?
- StringUtils工具类常用方法
- 数据刷新中的并行改进(三) (r5笔记第79天)
- SSH【史上最详细整合】
- Github 项目推荐 | TensorFlow 项目模板架构最佳实践
- 两个死锁的实例 (r5笔记第90天)
- SSM【史上最详细整合】
- 终结 finalize()和垃圾回收(garbage collection)
- 代码+实战:TensorFlow Estimator of Deep CTR —— DeepFM/NFM/AFM/FNN/PNN
- 【SSH测试整合Demo】企业人事管理系统
- Hybris 项目工程配置
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 树莓派基础实验31:MPU6050陀螺仪加速度传感器实验
- springboot gradle mybatis mysql配置(注解)
- PHP入门之流程控制
- 常用进制转换方法(取商留余)原理解析, 附基于栈实现进制转换的代码
- 用 jdom 解析 xml 文件时如何解决中文问题?如何解析?
- PHP入门之函数
- spring boot 启动报错 org/springframework/core/ErrorCoded
- PHP入门之数组
- PHP基础之排序
- 关于mysql limit offset的一点优化
- PHP基础之查找
- PHP木马免杀的一些总结
- PHP基础之面向对象篇
- PHP变量覆盖漏洞小结
- 算法复习 : 插入排序原理,记忆,时间复杂度 (7行java实现)