Latest 0.2.1
Homepage https://github.com/tbl00c/ZZFLEX
License MIT
Platforms ios 8.0, requires ARC
Authors

ZZFLEX

一个完善的iOS UI敏捷开发框架,基于UIKit,包含常用控件的链式API拓展、一个数据驱动的列表框架、一个事件处理队列。

Travis CocoaPods license MIT platofrm

screenshot1 screenshot1

更新

0.2.1

1、新增已有列表页不修改cell代码、迁移至ZZFLEX列表页方案

 self.addCells(@"ZZFDAlbumCell").toSection(sectionType).withDataModelArray(data)
.configAction(^(ZZFDAlbumCell *cell, ZZFDAlbumModel *model) {   // 配置cell,等价于cellForRowAtIndexPath时的配置逻辑
    [cell setModel:model];
})
.viewSize(CGSizeMake(itemWidth, itemWidth))         // 设置大小
.selectedAction(^ (ZZFDAlbumModel *model) {         // 点击事件,等价于didSelectRowAtIndexPath时的逻辑
    [XLPhotoBrowser showPhotoBrowserWithImages:@[model.image] currentImageIndex:0];
});

2、UITextFiled增加enable api

0.2.0

1、addCell新增configAction(__kindof UIView *itemView, id dataModel)方法,可以使用传统方式配置cell属性,示例:

self.addCell(@"ACell").toSection(sectionTag).configAction(^(UITableViewCell *cell, id model) {
   [cell.textLabel setText:model.name];
   [cell.detailTextLabel setText:model.phoneNumber];
   [cell setBackgroundColor:model.bgColor];
});

2、优化部分代码结构,修复已知bug

如何使用

1、直接导入方式

将项目下载到本地后,把ZZFlexibleLayoutFramework拖入到你的项目中,即可正常使用。

2、CocoaPods方式
pod 'ZZFLEX', :git => 'https://github.com/tbl00c/ZZFLEX.git'

功能模块

目前ZZFLEX主要包含以下5个功能模块:

UIView+ZZFLEX

UIView+ZZFLEX为UIkit中的常用控件增加了链式API的拓展,引入它后,我们可以直接为view addButtonaddLabeladdImageView等。然后通过链式API,可更加连贯快捷的进行控件的属性设置、Masonry布局和事件处理。

以给视图添加button为例说明:

screenshot1

可以看出,链式API十分的简洁高效,在大大缩减代码行数的同时、提高了代码的可读性。它使得同一控件的代码逻辑得以集中,我们称之为“控件的模块化”。

UIView+ZZFLEX是使用Objective-C的泛型实现的,可以无视继承关系、随意顺序设置控件属性。

如需对控件的属性进行编辑,可以这样写:

button.zz_make.frame(CGRectMake(0, 0, 100, 40)).title(@"hi").titleColor(@"how are u");

如需单独创建一个控件,不添加到视图上:

UIButton *button = UIButton.zz_create(1001).title(@"hello").titleHL(@"world").view;

你可以能会发现,在添加视图的时候,ZZFLEX会强制为视图添加一个tag,这样做的初衷是方便定位,此外如果你需要做一些用户行为统计及类似的功能,你或许会更感谢这种做法。

目前,UIView+ZZFLEX已添加链式API的控件有:

UIView, UIImageView, UILabel, UIControl, UITextField, UIButton, UISwitch, UIScrollView, UITextView, UITableView, UICollectionView

ZZFlexibleLayoutViewController

ZZFlexibleLayoutViewController是一个基于collectionView实现的数据驱动的列表页框架,可大幅降低复杂列表界面实现和维护的难度。

容器层

使用它,我们几乎无需关心和实现collectionView的各种代理方法。它的设计使得列表页的构建就如同拼图一般,只需要一件件的add需要的模块,我们想要的界面就绘制出来了。因此,使用它实现的页面极具拓展性维护性

screenshot1

在ZZFlexibleLayoutViewController中,我们不在使用sectionIndex/indexPath确定section/cell的位置,转而使用更唯一的sectionTag/viewTag代替。因为前者本质上是一个很不确定的数据、它会随着界面的变化而发生改变,很多与tableView/collectionView相关的崩溃也都与此有关。

元素层

和之前不同的是,所有添加到ZZFlexibleLayoutViewController中的cell、header、footer需要额外实现一个协议—ZZFlexibleLayoutViewProtocol:

screenshot1

cell/view实现这个协议的目的和好处有两个:

1、框架层得以统一处理collectionView与cell/header/footer的交互;

2、方便进行整体的性能优化,如缓存view/header/footter计算大小的方法的数据。


目前主要支持的功能:

添加 插入 获取 批量添加 批量插入 批量获取 编辑 删除 清空子数据 更新高度
section ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
cell ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
header/footer ✔️ ✔️ ✔️ ✔️

ZZFLEXAngel

ZZFlexibleLayoutViewController为列表页的开发带来的优异的拓展性和可维护性,但它是一个VC级别的实现,在一些业务场景下还是不够灵活的。

ZZFLEXAngel是ZZFlexibleLayoutViewController核心思想和设计提炼而成的一个“列表控制中心”,它与页面和列表控件是完全解耦的。

使用它,我们只需通过任意collectionView或tableView来初始化一个ZZFLEXAngel实例(本质是将列表页的dataSource和delegate指向ZZFLEXAngel或其子类的实例),然后就可以通过这个实例、和ZZFlexibleLayoutViewController中一样,使用那些好用的API了。

screenshot1

ZZFLEXEditExtension

此拓展使得ZZFlexibleLayoutViewController和ZZFLEXAngel具有了处理编辑页面的能力,其主要原理为规范了编辑类页面处理流程,并使用一个额外的模型来控制它:

初始标准数据模型 -> 经ZZFLEXEditModel封装的数据 -> UI展现 -> 用户编辑 -> 输入合法性判断 -> 标准数据模型 -> 导出数据

screenshot1 screenshot1

ZZFLEXRequestQueue

一些复杂的页面中会存在多个异步数据请求(net、db等),然而同时发起的异步请求,其结果的返回顺序是不确定的,这样会导致UI展示顺序的不确定性,很多情况下这是我们不希望看到的。

ZZFLEXRequestQueue的核心思想是“将一次数据请求的过程封装成对象”,它可以保证在此业务场景下,按队列顺序加载展示UI。

详见Demo。

其他

使用中的任何问题,欢迎提issure,也可与我交流:[email protected]

Latest podspec

{
    "name": "ZZFLEX",
    "version": "0.2.1",
    "platforms": {
        "ios": "8.0"
    },
    "summary": "u4e00u4e2aiOS UIu654fu6377u5f00u53d1u6846u67b6uff0cu57fau4e8eUIKitu5b9eu73b0uff0cu4e3bu8981u5305u542bu5e38u7528u63a7u4ef6u7684u94feu5f0fAPIu62d3u5c55u3001u4e00u4e2au6570u636eu9a71u52a8u7684u5217u8868u6846u67b6u3001u4e00u4e2au4e8bu4ef6u5904u7406u961fu5217u3002",
    "description": "u76eeu524dZZFLEXu4e3bu8981u5305u542bu4ee5u4e0b5u4e2au529fu80fdu6a21u5757uff1an UIView+ZZFLEXuff1au4e3aUIKitu4e2du5e38u7528u7684u63a7u4ef6u589eu52a0u4e86u94feu5f0fAPIu62d3u5c55uff0cu4f7fu5f97u63a7u4ef6u5c5eu6027u3001u4e8bu4ef6u3001u7ea6u675fu7684u8bbeu7f6eu4e00u6c14u5475u6210uff08u89c6u56feu7684u6a21u5757u5316uff09uff1bn ZZFlexibleLayoutViewControlleruff1au6570u636eu9a71u52a8u7684u5217u8868u9875u6846u67b6uff0cu57fau4e8eUICollectionViewuff0cu53efu4ee5u7b80u6d01u65b9u4fbfu7684u6784u5efau6570u636eu5c55u793au7c7bu7684u5217u8868u9875uff0cu5e76u5b9eu73b0u4e86cell/viewu7684u4e0ecollectionViewu7684u89e3u8026uff08cellu7684u6a21u5757u5316uff09uff1bn ZZFLEXAngeluff1aZZFlexibleLayoutViewControlleru903bu8f91u7684u62bdu79bbu51fau7684u4e00u4e2au89c6u56feu63a7u5236u5668uff0cu4e0du5728u7ee7u627fu81eaVCu4f7fu5176u66f4u52a0u8f7bu91cfuff0cu540cu65f6u652fu6301tableViewu3001collectionViewuff1bn ZZFLEXEditExtensionuff1au4e3aZZFLEXAngelu548cZZFlexibleLayoutViewControlleru589eu52a0u4e86u4e00u79cdu5904u7406u7f16u8f91u7c7bu9875u9762u7684u80fdu529buff1bnZZFLEXRequestQueueuff1au4e00u4e2au4e8bu4ef6u5904u7406u961fu5217uff0cu8bbeu8ba1u7684u521du8877u4e3au89e3u51b3u590du6742u9875u9762u591au63a5u53e3u8bf7u6c42UIu5237u65b0u987au5e8fu7684u95eeu9898u3002",
    "authors": {
        "libokun": "[email protected]"
    },
    "homepage": "https://github.com/tbl00c/ZZFLEX",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    },
    "source": {
        "git": "https://github.com/tbl00c/ZZFLEX.git",
        "tag": "0.2.1"
    },
    "requires_arc": true,
    "source_files": "ZZFLEX/**/*.{h,m,mm}"
}

Pin It on Pinterest

Share This