iOS用GKPageScrollView实现微博发现页滑动效果

楚宏胜
2023-12-01

前言

近期发现微博的发现页有这样一个功能,页面整体可以下拉刷新,当中间的标签上滑到顶部导航栏位置后,标签栏固定不动,下方列表页可以下拉刷新,上拉加载,导航栏左边出现返回按钮,当点击返回按钮后,页面回到初始位置。

于是我用我写的一个库GKPageScrollView实现了相应的效果,先来看下效果图:

实现

1、首先创建GKPageScrollView

- (GKPageScrollView *)pageScrollView {
    if (!_pageScrollView) {
        _pageScrollView = [[GKPageScrollView alloc] initWithDelegate:self]; // 创建并设置代理
        _pageScrollView.ceilPointHeight = GK_STATUSBAR_HEIGHT;  // 设置临界点高度
        _pageScrollView.isAllowListRefresh = YES;  // 允许列表刷新
        _pageScrollView.isDisableMainScrollInCeil = YES;  // 禁止mainScrollView在到达临界点后继续滑动
    }
    return _pageScrollView;
}
复制代码

2、实现GKPageScrollView的代理

#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;
}
复制代码

3、返回按钮点击处理

- (void)backAction {
    if (self.isMainCanScroll) { 
        [self.navigationController popViewControllerAnimated:YES];
    }else { // 到达临界点状态,滑动到原点
        [self.pageScrollView scrollToOriginalPoint];
        self.backBtn.hidden = YES;
        self.topView.alpha = 0;
    }
}
复制代码

4、右滑返回原点(要实现此功能可自己添加滑动手势或集成GKNavigationBarViewController) 这里以GKNavigationBarViewController为例:

    // 滑动到临界点时,设置代理
    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中,需要的可以下载查看。

另外推荐下我的图片浏览器GKPhotoBrowser

转载于:https://juejin.im/post/5c81cde0f265da2d8b636f50

 类似资料: