欢迎光临
我们一直在努力

LXFProtocolTool-swift协议方式实现功能的实用工具库【支持 Rx 】

建站超值云服务器,限时71元/月

LXFProtocolTool-swift协议方式实现功能的实用工具库【支持 Rx 】

项目介绍:

LXFProtocolTool

Build Status
Version
License
Platform

通过协议的方式来方便快捷地实现一些的实用功能,目前功能不多,往后会逐渐增加,喜欢的来个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 LinXunFeng‘s Blog

    • juejin 掘金

    • jianshu 简书

Usage

LXFNibloadable

当导入当前库时,UIViewUIViewController 则已经遵守了协议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)

lxf_EmptyDataSet

3、 更新定制

// 更新空白页数据
var config = EmptyConfig.normal
config.tipStr = tipStrArr[randomInt]
config.tipImage = UIImage(named: "tipImg\(randomInt)")

self.lxf.updateEmptyDataSet(tableView, config: config)

lxf_EmptyDataSet_update

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

lxf_Refreshable

如果一个界面有多个 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时,如果specifiedViewnil会自动填写,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)

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » LXFProtocolTool-swift协议方式实现功能的实用工具库【支持 Rx 】
分享到: 更多 (0)