关于使用面向协议来封装功能的实战可以参考我上篇文章 [iOS 面向协议方式封装空白页功能], 这里就不再赘述, 直接进入使用阶段吧
如果对面向协议有疑问的同学可以看下我之前的两篇文章
iOS - Swift 面向协议编程(一)
iOS - Swift 面向协议编程(二)
开源库
Name | Link |
---|---|
GitHub | https://github.com/LinXunFeng/LXFProtocolTool |
Wiki | Wiki 首页 https://github.com/LinXunFeng/LXFProtocolTool/wiki |
本文 Demo |
使用 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()
以下分两种情况说明
- 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
三, 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)
复制代码
结语
到这里相关的说明已罗列完毕, 有什么不清楚的可以下载看看, 或者在文章下方留言提问
https://github.com/LinXunFeng/LXFProtocolTool 主要是通过协议的方式来方便快捷地实现一些的实用功能, 除了本文提及的全屏旋转功能外还有其它实用功能的封装, 具体内容可以到 Wiki 首页 https://github.com/LinXunFeng/LXFProtocolTool/wiki 查找. 如果你有什么想实现的功能也可以提出来, 喜欢的就给个 Star 鼓励下我吧 , 感谢支持!
来源: https://juejin.im/post/5b9cd4596fb9a05d09654244