ZYSideSlipFilter是一個(gè)側(cè)邊欄條件篩選器,高度自定義各種篩選區(qū)域,AutoLayout動(dòng)態(tài)適配cell高度,功能當(dāng)然就是那個(gè),選擇條件,保存選擇狀態(tài),重置條件。即插即拔,基本支持自定義任何內(nèi)臟,樣式是怎樣完全由你制定,Demo我做成了商城風(fēng)格,怎樣用全在于你自己。ZYSideSlipFilter的工作核心是數(shù)據(jù)源,它貫穿了整個(gè)工作流程。

我們來看結(jié)構(gòu)圖:

以上截圖來自Demo,我們看見的數(shù)據(jù)、篩選區(qū)域、UI結(jié)構(gòu)全部都不是ZYSideSlipFilter決定的,all self-definition自定義。我們通過數(shù)據(jù)源(dataList)來跟Filter交流交換數(shù)據(jù),包括我們的篩選條目的cell結(jié)構(gòu),我們的篩選條件,默認(rèn)選擇,和用戶選擇的結(jié)果。也就是說這是一個(gè)變化的數(shù)據(jù)源,像是一張調(diào)查問卷,進(jìn)去是干凈的,而出來是涂畫過的。我們?cè)鯓油ㄟ^Filter這個(gè)中間者去給用戶填問卷呢?來看看數(shù)據(jù)源的結(jié)構(gòu)圖:

ZYSideSlipFilterRegionModel和containerCellClass
圖看起來有點(diǎn)復(fù)雜,沒關(guān)系我們只需要認(rèn)識(shí)最左邊的ZYSideSlipFilterRegionModel,一個(gè)RegionModel代表一個(gè)篩選區(qū)域,也就是說我們需要在Filter里增加一個(gè)篩選區(qū)域,就創(chuàng)建一個(gè)RegionModel,F(xiàn)ilter數(shù)據(jù)源里放的就是這個(gè)東西。而在RegionModel里面,最基本的我們只需要認(rèn)識(shí)containerCellClass這個(gè)property, 它代表這個(gè)這個(gè)篩選區(qū)域的UI布局和邏輯代碼所在的類(TableviewCell), 我們要求該自定義類繼承自SideSlipBaseTableViewCell, 自定義篩選區(qū)域tableViewCell,創(chuàng)建RegionModel,賦值containerCellClass,放進(jìn)dataList,我們自己的Filter就能顯示出來了
配置篩選項(xiàng)
上圖中我們可以看見Demo的3塊篩選區(qū)域截圖,下箭頭對(duì)應(yīng)了他們的RegionModel內(nèi)容,最基本的containerCellClass配置好后,我們可以用regionTitle存儲(chǔ)區(qū)域標(biāo)題,用itemList來存儲(chǔ)自定義的選項(xiàng)Model,isShowAll標(biāo)識(shí)著是否展開全部選項(xiàng),selectedItemList存儲(chǔ)著用戶選中的選項(xiàng)Model,這里再提一遍,用戶發(fā)生交互后,我們是要修改RegionModel的,用戶提交篩選時(shí)我們會(huì)拿到這些修改。對(duì)于以上這些property我們不用,或者不滿足需求都沒關(guān)系,customDict給你放任何附加內(nèi)容。
SideSlipFilter數(shù)據(jù)交流的方法
上面了解完如何去創(chuàng)建自己的Filter后,以下就是主要協(xié)同工作的api:

自定義篩選區(qū)域cell
繼承自SideSlipBaseTableViewCell
+ (NSString *)cellReuseIdentifier;
返回cell的重用標(biāo)識(shí)
+ (CGFloat)cellHeight;
返回cell固定高度(cell高度的其中一種方式,下面有詳細(xì)講解)
+ (instancetype)createCellWithIndexPath:(NSIndexPath *)indexPath;
返回cell實(shí)例對(duì)象
- (void)updateCellWithModel:(ZYSideSlipFilterRegionModel **)model indexPath:(NSIndexPath *)indexPath;
cell的更新方法,傳入model對(duì)象地址指針,供cell獲取用戶交互后修改
- (void)resetData;
用戶重置選項(xiàng)時(shí)會(huì)調(diào)用這個(gè)方法
SideSlipBaseTableViewCell代理
delegate
ZYSideSlipFilterController對(duì)象
- sideSlipTableViewCellNeedsReload
該cell需要刷新
- sideSlipTableViewCellNeedsPushViewController:animated:
該cell觸發(fā)條件后需要push頁(yè)面
- sideSlipTableViewCellNeedsScrollToCell:atScrollPosition:animated:
該cell觸發(fā)條件后需要滾動(dòng)到tableView的中央位置
通知
FILTER_NOTIFICATION_NAME_DID_RESET_DATA
FILTER_NOTIFICATION_NAME_DID_COMMIT_DATA
配置文件ZYSideSlipFilterConfig
FILTER_NAVIGATION_CONTROLLER_CLASS
Filter的導(dǎo)航控制器Class(構(gòu)造方法只支持- initWithRootViewController:)
各種UI參數(shù)
語言本地化Localizable.strings
目前配置了兩個(gè)bottomButton的title string,有需要可以在自己項(xiàng)目的.strings文件中配置,不配置則默認(rèn)為Reset, Commit
"sZYFilterReset"="Reset";
"sZYFilterCommit"="Commit";
自適應(yīng)cell高度
ZYSideSlipFilter會(huì)在每次reloadData時(shí)動(dòng)態(tài)適配cell高度,前提是cell內(nèi)subviews橫向縱向都部署好了對(duì)tableViewContentView的自動(dòng)約束,必須是對(duì)ContentView!!,對(duì)tableView無效!!
如果需要設(shè)置固定高度,則可以重寫父類SideSlipBaseTableViewCell的+ cellHeight方法即可。
Usage:
ZYSideSlipFilterController
創(chuàng)建ZYSideSlipFilterController實(shí)例,讓呼出者controller持有它,這樣我們能夠保持著Filter的狀態(tài)并且能夠多次呼出(我們要求呼出者必須有navigationController)
self.filterController = [[ZYSideSlipFilterController alloc] initWithSponsor:self
resetBlock:^(NSArray?*dataList)?{
//Reset?Data
} ?commitBlock:^(NSArray?*dataList)?{
//Commit?Data
}];
_filterController.animationDuration?=?.3f;
_filterController.sideSlipLeading?=?0.15*[UIScreen?mainScreen].bounds.size.width;
_filterController.dataList?=?[self?packageDataList];
[_filterController.navigationController setNavigationBarHidden:NO];
[_filterController?setTitle:@"title"];
就是這樣,我們的filter可以投向使用了嗎?并不是,最重要的是我們的數(shù)據(jù)源dataList。數(shù)據(jù)源的結(jié)構(gòu)見數(shù)據(jù)源結(jié)構(gòu)圖,ZYSideSlipFilter會(huì)按照數(shù)據(jù)源結(jié)構(gòu)規(guī)則去工作起來。
數(shù)據(jù)源準(zhǔn)備好后, 讓Filter顯示出來
[_filterController show];
自定義篩選RegionCell
@interface Custom***TableViewCell : SideSlipBaseTableViewCell
+ (NSString *)cellReuseIdentifier {
//cellReuseIdentifier
}
+?(CGFloat)cellHeight?{
//option
//you?can?use?autolayout?to?cellContentView?Rather?than?this?func
}
+?(instancetype)createCellWithIndexPath:(NSIndexPath?*)indexPath?{
//cell?instance?object
}
-?(void)updateCellWithModel:(ZYSideSlipFilterRegionModel?**)model
indexPath:(NSIndexPath?*)indexPath?{
//update?your?cell
}
-?(void)resetData?{
//option
//respond?while?user?click?resetButton
}
Demo自定義Region示意圖
