近期發現微博的發現頁有這樣一個功能,頁面總體能夠下拉刷新,當中間的標籤上滑到頂部導航欄位置後,標籤欄固定不動,下方列表頁能夠下拉刷新,上拉加載,導航欄左邊出現返回按鈕,當點擊返回按鈕後,頁面回到初始位置。git
因而我用我寫的一個庫GKPageScrollView實現了相應的效果,先來看下效果圖: github
一、首先建立GKPageScrollView瀏覽器
- (GKPageScrollView *)pageScrollView {
if (!_pageScrollView) {
_pageScrollView = [[GKPageScrollView alloc] initWithDelegate:self]; // 建立並設置代理
_pageScrollView.ceilPointHeight = GK_STATUSBAR_HEIGHT; // 設置臨界點高度
_pageScrollView.isAllowListRefresh = YES; // 容許列表刷新
_pageScrollView.isDisableMainScrollInCeil = YES; // 禁止mainScrollView在到達臨界點後繼續滑動
}
return _pageScrollView;
}
複製代碼
二、實現GKPageScrollView的代理bash
#pragma mark - GKPageScrollViewDelegate
- (UIView *)headerViewInPageScrollView:(GKPageScrollView *)pageScrollView {
return self.headerView;
}
- (UIView *)pageViewInPageScrollView:(GKPageScrollView *)pageScrollView {
return self.pageView;
}
- (NSArray<id<GKPageListViewDelegate>> *)listViewsInPageScrollView:(GKPageScrollView *)pageScrollView {
return self.childVCs;
}
- (void)mainTableViewDidScroll:(UIScrollView *)scrollView isMainCanScroll:(BOOL)isMainCanScroll {
self.isMainCanScroll = isMainCanScroll;
if (!isMainCanScroll) {
self.gk_navLeftBarButtonItem = self.backItem; // 到達臨界點後顯示返回按鈕
self.gk_popDelegate = self;
}else {
self.gk_navLeftBarButtonItem = nil;
self.gk_popDelegate = nil;
}
// topView透明度漸變
// contentOffsetY GK_STATUSBAR_HEIGHT-64 topView的alpha 0-1
CGFloat offsetY = scrollView.contentOffset.y;
CGFloat alpha = 0;
if (offsetY <= GK_STATUSBAR_HEIGHT) { // alpha: 0
alpha = 0;
}else if (offsetY >= 64) { // alpha: 1
alpha = 1;
}else { // alpha: 0-1
alpha = (offsetY - GK_STATUSBAR_HEIGHT) / (64 - GK_STATUSBAR_HEIGHT);
}
self.topView.alpha = alpha;
}
複製代碼
三、返回按鈕點擊處理ui
- (void)backAction {
if (self.isMainCanScroll) {
[self.navigationController popViewControllerAnimated:YES];
}else { // 到達臨界點狀態,滑動到原點
[self.pageScrollView scrollToOriginalPoint];
self.backBtn.hidden = YES;
self.topView.alpha = 0;
}
}
複製代碼
四、右滑返回原點(要實現此功能可本身添加滑動手勢或集成GKNavigationBarViewController) 這裏以GKNavigationBarViewController爲例:spa
// 滑動到臨界點時,設置代理
if (!isMainCanScroll) {
self.backBtn.hidden = NO;
self.gk_popDelegate = self;
}else {
self.backBtn.hidden = YES;
self.gk_popDelegate = nil;
}
// 實現代理方法
#pragma mark - GKViewControllerPopDelegate
// 右滑手勢結束後會調用此方法
- (void)viewControllerPopScrollEnded {
[self backAction];
}
複製代碼
經過上面的步驟,就能實現微博發現頁的效果了,固然還有一些其餘細節處理,具體看demo。代理
上面所說的demo都在GKPageScrollView中,須要的能夠下載查看。code
另外推薦下個人圖片瀏覽器GKPhotoBrowsercdn