開發(fā)過程中梢夯,經(jīng)常碰到有需求說要當(dāng)頁面下,有多個(gè)可點(diǎn)擊晴圾,可滑動(dòng)切換的視圖颂砸。如網(wǎng)易新聞的首頁,部分app的個(gè)人信息頁等死姚。實(shí)現(xiàn)的思路可以是UIPageViewController多頁面混合開發(fā)人乓,或者addChildViewController的方式。
本篇講的是另外一種方式都毒,在自定義的scrollView上根據(jù)frame添加view色罚,通過改變contentOffset達(dá)到更換視圖的效果。一般情況下账劲,可滑動(dòng)的視圖不會(huì)超過四個(gè)戳护,為防止該功能每次需要的時(shí)候都要重寫,就做了一個(gè)封裝的SegmentContentView瀑焦,可支持動(dòng)態(tài)初始化腌且,支持2~4個(gè)tableView的切換。
防止.h文件暴露出來的方法太多榛瓮,所以只釋放了需要一些屬性和方法铺董,初始化的時(shí)候,傳入想要的tableView的數(shù)目創(chuàng)建view禀晓,selectFlagWithIndex該方法是在外部點(diǎn)擊切換按鈕精续,主動(dòng)更改contentOffset坝锰,默認(rèn)是沒有加切換動(dòng)畫的。
@property (nonatomic, strong) UITableView * firstTableView;
@property (nonatomic, strong) UITableView * secondTableView;
@property (nonatomic, strong) UITableView * thirdTableView;
@property (nonatomic, strong) UITableView * fourthTableView;
@property (nonatomic, weak) id <SegmentContentViewDelegate> segmentDelegate;
/**
* 根據(jù)傳入的數(shù)目驻右,初始化視圖
*/
- (instancetype)initWithFrame:(CGRect)frame tableViewCounts:(NSInteger)counts;
/**
* 根據(jù)頭部點(diǎn)擊按鈕滑動(dòng)到該tableView
*/
- (void)selectFlagWithIndex:(NSInteger)index;
以下是SegmentContentView必須實(shí)現(xiàn)的代理方法什黑,是把view內(nèi)部的tableView的dataSource代理放了出來崎淳,根據(jù)需求不同靈活更改
/**
* 外放cell數(shù)目
*/
- (NSInteger)creatCellWithTableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
/**
* 外放自定義的cell
*/
- (UITableViewCell *)creatCellWithTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath;
以下是自定義的一些代理堪夭,因?yàn)楸敬伍_發(fā)中有一個(gè)根據(jù)滑動(dòng)位移,需要把頭像縮小到導(dǎo)航欄的需求拣凹,如果再碰到這種情況森爽,可以根據(jù)tableView滑動(dòng)的距離自行添加動(dòng)畫
/**
* 外放cell高度
*/
- (CGFloat)creatCellHeightWithTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath;
/**
* 外放頭視圖
*/
- (UIView *)creatHeaderViewWithTableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
/**
* 外放頭視圖高度
*/
- (CGFloat)creatHeaderViewHeightWithTableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
/**
* 滑動(dòng)到另外一個(gè)tableView可以產(chǎn)生的回調(diào)
*/
- (void)scrollToOtherTableView:(UITableView *)tableView index:(NSInteger)index;
/**
* 針對(duì)tableView滑動(dòng)外放的方法
*/
- (void)scrollWithTableView:(UITableView *)tableView;
以下是出來的效果
關(guān)于滑動(dòng)位移改變,計(jì)算出具體位移改變量嚣镜,滑動(dòng)過程中爬迟,改變相應(yīng)同比例數(shù)值,需要注意的點(diǎn)是scrollView的scrollViewDidScroll滑動(dòng)代理菊匿,并不是逐幀執(zhí)行的付呕,在滑動(dòng)過快的時(shí)候只通過代理回調(diào),會(huì)出現(xiàn)掉幀的情況跌捆,尤其是在開始和結(jié)束的時(shí)候徽职,一旦超出滑動(dòng)范圍,需要補(bǔ)調(diào)一次代理佩厚,設(shè)置需要的frame范圍姆钉,用戶體驗(yàn)會(huì)好很多。
這次需求要求的是頭部縮放的滑動(dòng)范圍內(nèi)抄瓦,多個(gè)tableView也應(yīng)當(dāng)同步滑動(dòng)潮瓶,否則用戶在切換不同的tableView時(shí),因?yàn)轭^視圖高度不一樣而不美觀钙姊,所以實(shí)際上看上去像是頭視圖的view毯辅,是添加在VC上的,與SegmentContentView同級(jí)煞额,覆蓋在tableView的透明頭視圖上思恐,所以減少了創(chuàng)建四個(gè)頭視圖,避免了需要同步修改多個(gè)頭視圖狀態(tài)的問題