先看效果圖:

ScreenCaptureProject3.gif

demo.gif
分頁控制器分兩部分,
一是分頁控制器,標題聯(lián)動,分為內(nèi)容頁和導航標題視圖,通過點擊和滾動來同步狀態(tài)。
#pragma mark - delegate
#pragma mark - 導航分類選擇代理 點擊標題滾動到相應(yīng)的界面
- (void)XSNavChooseView:(XSNavCouseChoseView *)chooseView clickItem:(id)itemModel withIndex:(NSInteger)index {
CGFloat offsetX = index *self.view.frame.size.width;
[_backScrollView setContentOffset:CGPointMake(offsetX,0)animated:NO];
[self addChildVCWithIndex: index];
}
#pragma mark - ScroollView Delegate 拖動結(jié)束同步標題狀態(tài)
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
if (![scrollView isKindOfClass:[UITableView class] ]) {
CGPoint offset = scrollView.contentOffset;
_navCoureCategoryView.currentBtnIndex = offset.x/self.view.frame.size.width;
NSInteger index = offset.x/self.view.frame.size.width;
[self addChildVCWithIndex: index];
}
}
所有的子控制器都是作為首頁的自控制器,并在界面顯示時候加載出來,支持標題的增減,不過至少保留一個首頁
標題改變時候只改變導航標題
- (void)setNavTitleAry:(NSMutableArray *)navTitleAry {
_navTitleAry = navTitleAry;
self.navCoureCategoryView.modelAry = navTitleAry;
self.backScrollView.contentSize = CGSizeMake(self.view.frame.size.width * _navTitleAry.count, _backScrollView.frame.size.height);
[_backScrollView setContentOffset:CGPointMake(0,0)animated:NO];
// 導航欄數(shù)據(jù)變化移除子控制器
[self.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (![obj isKindOfClass:[XSRecommendVC class]]) {
//[self removeChild:obj];
[obj removeFromParentViewController];
}
}];
}
只有視圖顯示,滾動或者點擊標題才添加到首頁
- (void)addChildVCWithIndex:(NSInteger )index {
__block BOOL ishasVC = NO;
[self.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj.title isEqualToString:_navTitleAry[index]]) {
ishasVC = YES;
}
}];
// 判斷是否存在自控制器, 沒有添加
if (ishasVC == YES) {
return;
}
NSString *titleName = _navTitleAry[index];
XSCourseCategoryVC *courseVC = [[XSCourseCategoryVC alloc] init];
courseVC.view.frame = CGRectMake(self.view.frame.size.width * index, 0, self.view.frame.size.width, _backScrollView.frame.size.height);
[_backScrollView addSubview:courseVC.view];
courseVC.title = titleName;
[self addChildViewController:courseVC];
}
二是分類選擇器,支持collectionView的增刪,拖動排序,原樣是一個仿騰訊新聞的頻道選擇器,我在原來的基礎(chǔ)上滿足需求做了修改,原作者做了詳細的說明,具體的請鏈接到:http://blog.csdn.net/u013282507/article/details/54374952
// 科目選擇器
- (void)pushToChooseCourseCategoryVC {
typeof(self) weakSelf = self;
[[XLChannelControl shareControl] showChannelViewWithInUseTitles:_navTitleAry unUseTitles:_unUserTitleAry finish:^(NSArray *inUseTitles, NSArray *unUseTitles, NSString *title, BOOL isChange) {
if (isChange) {
weakSelf.navTitleAry = inUseTitles.mutableCopy;
weakSelf.unUserTitleAry = unUseTitles.mutableCopy;
}
if (title) {
// 點擊 相應(yīng)標題跳轉(zhuǎn)到指定界面
[weakSelf.navTitleAry enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([title isEqualToString:obj]) {
[self addChildVCWithIndex:idx];
weakSelf.navCoureCategoryView.currentBtnIndex = idx;
CGFloat offsetX = idx *weakSelf.view.frame.size.width;
[weakSelf.backScrollView setContentOffset:CGPointMake(offsetX,0)animated:NO];
}
}];
}
}];
}

Jietu20171018-232022@2x.jpg

Jietu20171018-232056@2x.jpg