项目介绍:
LXFProtocolTool
通过协议的方式来方便快捷地实现一些的实用功能,目前功能不多,往后会逐渐增加,喜欢的来个Star吧 : )
对Swift协议不熟悉的同学可以阅读以下两篇文章做下了解:
iOS – Swift 面向协议编程(一) — 【LXF】
【掘金】
【简书】
iOS – Swift 面向协议编程(二) — 【LXF】
【掘金】
【简书】
GitHub
LinXunFeng
CocoaPods
LXFProtocolTool 支持CocoaPods:
-
完全安装
pod 'LXFProtocolTool'
当然,也可以根据自己的需要安装指定子库
-
Xib加载
pod 'LXFProtocolTool/LXFNibloadable'
-
空白视图
pod 'LXFProtocolTool/EmptyDataSetable'
-
刷新控件
pod 'LXFProtocolTool/Refreshable'
-
关联属性
pod 'LXFProtocolTool/AssociatedObjectStore'
-
全屏
pod 'LXFProtocolTool/FullScreenable'
Usage
具体功能与使用请跳转 — Wiki首页
Wiki目录
-
LXFNibloadable
-
EmptyDataSetable
-
Refreshable
-
FullScreenable
License
LXFProtocolTool is available under the MIT license. See the LICENSE file for more info.
Author
-
LinXunFeng
-
email: 598600855@qq.com
-
Blogs
-
LinXunFeng‘s Blog
-
掘金
-
简书
-
Usage
LXFNibloadable
当导入当前库时,UIView
和 UIViewController
则已经遵守了协议LXFNibloadable
仅需要xib
的名字与当前类相同即可正常使用
通过静态方法loadFromNib()
创建View
或者Controller
let view = LXFXibTestView.loadFromNib()
let controller = LXFXibTestViewController.loadFromNib()
UITableView
// 注册 cell
tableView.registerCell(LXFCustomCell.self)
// 注册 headerFooterView
tableView.registerHeaderFooterView(LXFCustomHeaderView.self)
// 复用 cell
tableView.dequeueReusableCell(LXFCustomCell.self, forIndexPath: indexPath)
// 复用 headerFooterView.dequeueResuableHeaderFooterView(LXFCustomHeaderView.self)
tableView.
UICollectionView
// 注册 cell
collectionView.registerCell(LXFCustomCell.self)
// 复用 cell
collectionView.dequeueReusableCell(LXFCustomCell.self, forIndexPath: indexPath)
EmptyDataSetable
iOS 面向协议方式封装空白页功能
1、UIViewControllor或UIView遵守协议 EmptyDataSetable
extension LXFEmptyDemoController: EmptyDataSetable {
}
2、调用方法 updateEmptyDataSet
// 定制方式
// config 不传值时使用默认配置
self.lxf.updateEmptyDataSet(tableView, config: EmptyConfig.noData)
3、 更新定制
// 更新空白页数据
var config = EmptyConfig.normal
config.tipStr = tipStrArr[randomInt]
config.tipImage = UIImage(named: "tipImg\(randomInt)")
self.lxf.updateEmptyDataSet(tableView, config: config)
Refreshable
1、遵守协议 Refreshable
class LXFRefreshableController: UIViewController, View, Refreshable {}
2、配置与绑定
// 自定义配置
/*
rx.refresh<T: RefreshControllable>(
_ vm: T,
_ scrollView: UIScrollView,
headerConfig: RefreshableHeaderConfig? = nil,
footerConfig: RefreshableFooterConfig? = nil
) -> Observable<RefreshType>
*/
// 注:vm 需要传入一个遵守了 RefreshControllable 协议的对象
self.rx.refresh(reactor, tableView)
.map { .fetchList($0 == .header) }
.bind(to: reactor.action)
.disposed(by: disposeBag)
这里也可以单独设置上下拉
// 自定义配置
self.rx.headerRefresh(reactor, tableView, headerConfig: RefreshConfig.normalHeader)
.map { .fetchList(true) }
.bind(to: reactor.action)
.disposed(by: disposeBag)
// 默认配置
self.rx.footerRefresh(reactor, tableView)
.map { .fetchList(false) }
.bind(to: reactor.action)
.disposed(by: disposeBag)
3、viewModel 遵守协议
final class LXFRefreshableReactor: Reactor, RefreshControllable {}
遵守协议 RefreshControllable
后便拥有 refreshStatus
属性,可以用来控制刷新控件的状态
self.lxf.refreshStatus.value = .noMoreData
self.lxf.refreshStatus.value = .resetNoMoreData
如果一个界面有多个 UIScrollView
,且需要分别控件刷新状态,那么可以使用 refreshStatusRespective
属性
// 参数一:状态
// 参数二:UIScrollView 的 tag
lxf.refreshStatusRespective.value = (.noMoreData, viewTag)
FullScreenable
一、配置
若项目支持横屏(Landscape)则跳过此配置步骤
若项目只支持竖屏(Portrait)的话需要在
AppDelegate
中实现如下方法
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return UIApplication.shared.lxf.currentVcOrientationMask
}
二、使用案例
方法与属性的调用都需要命名空间加上
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)