GithubHelp home page GithubHelp logo

quintgao / gkpagescrollview Goto Github PK

View Code? Open in Web Editor NEW
1.5K 21.0 280.0 27.74 MB

iOS类似微博、抖音、网易云等个人详情页滑动嵌套效果

License: MIT License

Objective-C 56.13% Ruby 0.54% Swift 43.33%

gkpagescrollview's Introduction

iOS类似微博、抖音、网易云等个人详情页滑动嵌套效果

GKPageScrollView是一个UIScrollview嵌套滑动库,主要参考了JXPagingView,在他的基础上做了修改,实现了自己想要的效果。

GKPageSmoothView是一个可延续滑动的UIScrollView嵌套滑动库

特性

GKPageScrollView

  • 支持上下滑动、左右滑动,手势返回等
  • 支持如UITableView的sectionView的悬停效果
  • 支持多种分页控件,如JXCategoryView,WMPageController,VTMagic
  • 可实现导航栏颜色渐变、头图下拉放大等效果
  • 支持主页、列表页下拉刷新,列表页上拉加载
  • 支持列表懒加载创建

GKPageSmoothView

  • 支持上下滑动、左右滑动、手势返回等
  • 支持顶部悬停、底部悬停
  • 支持底部悬停拖拽,可实现豆瓣电影详情页效果
  • 支持如JXCategoryView,JXSegmentedView等的分段控件
  • 可实现导航栏颜色渐变、头图下拉放大等效果
  • 支持主页下拉刷新、列表页上拉加载

1.5.0升级指南

1.5.0版本以后,使用swift版本需
pod 'GKPageScrollView/Swift'
pod 'GKPageSmoothView/Swift'

使用方法

1、手动安装

下载GKPageScrollView demo
  • Objective-C:
    拖入Source/GKPageScrollView文件夹中的.h和.m文件,#import "GKPageScrollView.h",开始使用
    拖入Source/GKPageSmoothView文件夹中的.h和.m文件,#import "GKPageSmoothView.h",开始使用

  • Swift:
    拖入Source/GKPageScrollViewSwift文件夹中的.swift文件,开始使用
    拖入Source/GKPageSmoothViewSwift文件夹中的.swift文件,开始使用

2、CocoaPods安装:

  • Objective-C:
    pod 'GKPageScrollView' then #import <GKPageScrollView/GKPageScrollView.h>
    pod 'GKPageSmoothView' then #import <GKPageSmoothView/GKPageSmoothView.h>

  • Swift:
    pod 'GKPageScrollViewSwift' then import GKPageScrollViewSwift
    pod 'GKPageSmoothViewSwift' then import GKPageSmoothViewSwift

如果发现pod search GKPageScrollView/GKPageScrollViewSwift 不是最新版本,在终端执行pod setup命令更新本地spec镜像缓存,重新搜索即可。

3、Swift Package Manager 安装

依次点击 Xcode 的菜单 File > Swift Packages > Add Package Dependency,填入 https://github.com/QuintGao/GKPageScrollView.git
选择需要使用的库,GKPageScrollView/GKPageScrollViewSwift/GKPageSmoothView/GKPageSmoothViewSwift

常见问题

  • 1、headerView出现多个,不要在headerView代理方法中做视图创建、添加等操作

  • 2、手势处理

  • 3、listView使用UICollectionView崩溃,参考demo中的GKBaseCollectionViewLayout,重写collectionViewContentSize

  • 4、关于GKPageScrollView的懒加载方式

    • 1.8.6及之前版本,需设置categoryView.contentScrollView
       _categoryView.contentScrollView = self.pageScrollView.listContainerView.collectionView;
    
    • 1.8.7及之后版本,需设置categoryView.listContainer
       // OC版本
       _categoryView.listContainer = (id<JXCategoryViewListContainer>)self.pageScrollView.listContainerView;
    
       // Swift版本
       // 1.实现JXSegmentedViewListContainer协议
       extension GKPageListContainerView: JXSegmentedViewListContainer {}
    
       // 2.设置listContainer
       segmentedView.listContainer = self.pageScrollView.listContainerView
    
  • 5、列表使用UICollectionView不能上下滑动?

把UICollectionView的alwaysBounceVertical属性设置为true

效果图

说明 效果图
微博个人主页 wb
微博发现页 wb_find
网易云歌手页 wy
抖音个人主页 dy
主页下拉刷新 mainRefresh
列表下拉刷新 listRefresh
列表懒加载 lazyload
嵌套滑动1 nest1
嵌套滑动2 nest2
豆瓣电影详情 db

说明

iOS-多个UIScrollView滑动嵌套(仿微博、抖音、网易云个人详情页)
iOS用GKPageScrollView实现微博发现页滑动效果
iOS用GKPageScrollView实现多层分类嵌套滑动
【iOS】仿豆瓣电影详情页嵌套滑动效果

版本更新

最近更新
  • 2024.04.18 1.9.4 - 添加隐私清单文件
  • 2023.12.28 1.9.3 - 修复Swift报错 #140
  • 2023.11.08 1.9.2 - 横竖屏适配,代码优化
  • 2023.10.17 1.9.0 - 1、修复子列表无法获取到导航控制器的问题 2、其他逻辑及代码优化
  • 2023.08.03 1.8.9 - GKPageListViewDelegate增加新的方法,支持子列表切换索引 #132
  • 2023.05.23 1.8.8 - 修复oc项目pod引入后启动崩溃的问题 #127,GKPageSmoothView设置defaultSelectedIndex优化
  • 2023.05.22 1.8.7 - 列表生命周期完善
  • 2023.05.11 1.8.6 - 1、修复xcode14 image not found #115 2、尝试修复设置contentOffset导致的死循环 #113
  • 2023.04.24 1.8.5 - GKPageScrollView新增属性控制横向滚动的UIScrollView
  • 2023.01.11 1.8.4 - 修复GKPageSmoothView使用CollectionView时可能崩溃的问题 #122
  • 2022.12.07 1.8.3 - 优化代码,增加主页和列表页同时支持刷新demo
  • 2022.10.22 1.8.2 - 1、修复内存泄漏问题 #117 2、尝试解决崩溃问题 #116
  • 2022.10.17 1.8.1 - 刷新headerView方法优化 #111
  • 2022.09.02 1.8.0 - 1、修复GKPageScrollView滑动headerView后isMainCanScroll不准确的问题 2、GKPageScrollView新增restoreWhenRefreshHeader属性,可控制刷新headerView后的位置 3、滑动到原点和临界点方法新增是否需要动画方法 #111
  • 2022.08.18 1.7.5 - 修复GKPageSmoothView的headerView或segmentedView高度获取不准确问题
  • 2022.07.14 1.7.4 - 修复refreshHeaderView后可能出现异常的问题 #109
  • 2022.06.23 1.7.3 - 1、当showInFooter为YES时刷新优化 2、修复可能出现的列表抖动问题 #98 #108
  • 2022.04.14 1.7.2 - 1、GKPageScrollView支持动态设置frame和ceilPointHeight #104 2、GKPageSmoothView新增refreshSegmentedView方法,bug修复 #103
  • 2022.03.15 1.7.1 - 修复headerView设置高度较低的问题 #100
  • 2021.12.07 1.7.0 - 1、GKPageScrollView增加showInFooter属性,解决header超过一屏时的卡顿问题 #94 2、GKPageSmoothView放开currentIndex属性
历史更新
  • 2021.11.08 1.6.9 - 1、修复低版本xcode报错问题 #87 2、修复内存泄漏问题 #88 3、修复cell高度无法自适应问题 #89
  • 2021.10.29 1.6.8 - GKSmoothView优化,修复吸顶后点击切换显示异常问题 #87
  • 2021.10.20 1.6.7 - GKSmoothView frame变化优化
  • 2021.10.15 1.6.6 - 优化更新,增加设置cell属性代理 #81
  • 2021.09.08 1.6.5 - 修复可能出现的黑屏问题 #77
  • 2021.09.06 1.6.3 - 修复改变外部尺寸,子列表尺寸无变化问题
  • 2021.07.30 1.6.2 - GKSmoothView增加代理方法,是否允许重置listScrollView的位置
  • 2021.07.28 1.6.1 - GKSmoothView内部优化,修改内容不足一屏时的逻辑
  • 2021.07.19 1.6.0 - 新增禁止主页滑动属性,设置后只有列表可以滑动
  • 2021.06.16 1.5.8 - GKPageScrollView内部优化,修复某些情况下快速滑动导致CPU升高的问题
  • 2021.04.19 1.5.6 - 修复GKPageSmoothView加载UICollectionView时的bug,去掉打印
  • 2021.04.16 1.5.5 - GKPageSmoothView增加返回header容器高度,demo增加下拉刷新和上拉加载
  • 2021.03.19 1.5.4 - 代码优化,GKPageSmoothView新增快速滑动到原点、临界点的方法
  • 2021.01.25 1.5.3 - 1、修复GKPageSmoothView swift版本可能出现的错乱问题 #65, 2、GKPageScrollView增加刷新segmentedView方法
  • 2021.01.07 1.5.2 - 修复某些情况下出现页面错乱问题#64
  • 2021.01.02 1.5.0 - pod and spm update
  • 2020.12.10 1.4.2 - 拆分GKPageScrollView和GKPageSmoothView,GKPageSmoothView支持底部悬浮、底部拖拽
  • 2020.12.09 1.4.1 - 增加属性可传入横向滑动的scrollView,更加方便处理手势冲突
  • 2020.12.01 1.4.0 - 修复延续滑动可能出现header不能滑动的bug #57
  • 2020.08.07 1.3.8 - 修复列表刷新快速滑动时的bug
  • 2020.07.22 1.3.7 - 滑动延续代码优化
  • 2020.05.19 1.3.6 - 增加列表延续滑动功能,需使用GKPageSmoothView类
  • 2020.04.18 1.3.5 - 优化代码,支持Swift 5.x
  • 2019.11.11 1.3.3 - 修复GKPageScrollView与返回手势的滑动冲突
  • 2019.10.25 1.3.1 - 增加GKPageTableViewGestureDelegate,解决嵌套时的滑动冲突
  • 2019.10.22 1.3.0 - 修复pageScrollView高度为0时出现的崩溃问题
  • 2019.10.09 1.2.9 - 解决pageScrollView不是全屏时的高度不准确问题
  • 2019.06.16 1.2.7 - 优化设置列表加载方式的方法,可通过属性设置懒加载方式
  • 2019.06.06 1.2.6 - 解决当HeaderView的高度设置为小于1时列表不能滑动问题
  • 2019.06.03 1.2.5 - 修改点击状态栏后位置错乱问题
  • 2019.04.22 1.2.3 - UITableView cell点击处理,解决使用mj_header可能出现的bug
  • 2019.04.18 1.2.1 - 公开滑动处理方法,修复方法版本判断错误问题
  • 2019.03.21 1.2.0 - 优化刷新方法,可用于实现item个数不固定的情况
  • 2019.03.14 1.1.0 - 增加列表懒加载功能,可用于子列表较多的情况
  • 2019.03.04 1.0.9 - 增加Swift版本,pod统一更新到1.0.9
  • 2019.02.25 1.0.7 - 优化切换临界点和原点的方法,增加仿微博发现页demo
  • 2019.02.20 1.0.6 - 增加快速切换临界点和原点的方法
  • 2018.12.11 1.0.3 - 支持下拉刷新、上拉加载

作者

            

回到顶部

gkpagescrollview's People

Contributors

lexrus avatar quintgao avatar wy-time avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gkpagescrollview's Issues

collectionView无法滚动

结构是:一级头部+pageScrollView+2个子控制器,其中一个一级控制器加二级头部高度为0+pageScrollView+子控制器。1.滚动到临界点,2.滚动其他子控制器列表,3.切到是collectionView的子控制器时无法滚动

不走delegate

  • (UIView *)pageViewInPageScrollView:(GKPageScrollView *)pageScrollView

使用中碰到的几个问题

你好,使用过程中遇到几个问题。
1、如果mainTableView滚动了一段距离,那么点击状态栏回滚顶部以后,上拉的时候头部距离会直接偏移。
2、直接拖拽头部会卡到JXSegment的头部位置,mainTableView不会继承头部滚动的加速度。
3、头部中添加CollectionView的横向滚动,和纵向滚动的手势可以共存,既可以横向滚动也可以纵向滚动,无法保证同一个时间只有一种手势。
4、mainTableView的滚动有时候手势无法响应的问题。
期待您能尽快解决这些存在的问题。

Xcode 11 iOS 13下闪退问题

GKPageScrollView.m

  • (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return self.frame.size.height - self.ceilPointHeight;
    }

原因是, 在这里获取到的 self.frame.size.height 为0

添加collectionview之后滑动很卡顿

在一个vc里同时添加了tableview和collectionview之后,滑动tableview正常,很顺畅,切换到collectionview之后上下滑动很卡顿,请问是什么原因?

子控制器能加入懒加载吗?

一共有 三个tab,动态,文章,更多
列如 第一次加载,单纯加载 动态这个控制器,但滑动到文件控制器,才加载它。

不生效

使用方法有点迷糊,能有个简单demo吗

切换 Page 后如何将对应的 PageListView 置顶?

在使用 GKPageScrollView 的非懒加载模式时, 有这样一个场景,:

  1. SegmentView 吸顶后将 Segment A 的对应的 PageListA 向上滑动一部分;
  2. 切换到 Segment B, 然后下滑 PageListB,将 SegmentView 从吸顶状态变为非吸顶状态;
  3. 切换到 Segment A, 实际操作中发现,当在此滑动 mainTableView 时,PageList A 会重置到置顶状态(这个逻辑不是很明白)。

做过的尝试:
在 SegmentView 的置顶跟非置顶状态切换瞬间,记录当前 mainTabView 的 lastOffset, 然后切换后,重新设置 mainTableView 的 offset 为当前记录的 lastOffset.

请问如何才能做到,切换到 Segment A 后, PageListA 列表的第一个元素处于最顶部的置顶状态,跟淘宝首页类似。

childVCs的VC 的tableView 代理方法不走

WechatIMG272

segmentView 下边三个vc,每个vc 有个tableview,
数据请求下来后, 调用了 currentVC.tableView reloadData, 但是 代理方法只执行了numberOfRowsInSection,返回的是3,
但是不执行cellforrowatindex

子ViewController有一个固定在底部的view

您好:
条件:子ViewController有一个固定在底部的view,父ViewController使用GKPageScrollView并添加子ViewController
问题:子ViewController底部的view一开始并不会显示,需要向上滑动一段距离才会显示。这段距离就是GKPageScrollView的headerView的高度。

我想让子ViewController固定在底部的view固定住,除了把view转移到父ViewController上,还有什么方法吗?

其中一个分页的tableView的cell使用帧动画有问题

1、其中一个分页的tableView的cell使用帧动画有问题,
帧动画开始的时候,上下滑动的时候,帧动画会停止。不是cell复用的问题。
以上问题在使用最新的GKPageSmoothView的时候是ok的

2、但是[GKPageSmoothVie refreshHeaderView],默认会滑到顶部

3、GKPageSmoothVie没有提供“DidEndDragging”、“DidEndDecelerating”、“WillBeginDragging”等滚动相关方法

列表点击无法跳转哦

发现self.navigationController 为nil无法push造成的,这个有什么好方法解决?只能传递controller过去?

导航栏状态切换

目前导航栏状态切换需要在- (void)mainTableViewDidScroll:(UIScrollView *)scrollView isMainCanScroll:(BOOL)isMainCanScroll里面自己实现,希望能封装几种常见模式。

1.使用懒加载崩溃问题2.列表控制器中的self.navigationController为nil,列表控制器没办法添加到当前控制器

1.使用懒加载崩溃问题:
使用了JXCategoryView,JXCategoryListContainerView是高度封装的,它自动把列表控制器添加到JXCategoryListContainerViewController上。列表控制器与当前控制器中间隔了一个JXCategoryListContainerViewController,而JXCategoryListContainerViewController没办法实现GKPageListViewDelegate这个代理。造成了
"- (id)pageScrollView:(GKPageScrollView *)pageScrollView initListAtIndex:(NSInteger)index" 这个方法无法返回有效代理。
崩溃输出:reason: 'child view controller:<列表控制器: 0x7fc60dd844e0> should have parent view controller:<当前控制器: 0x7fc60dd2cb30> but actual parent is:<JXCategoryListContainerViewController: 0x7fc60dc678e0>'

2.列表控制器点击self.navigationController为nil
因为1的问题导致列表控制器中的self.navigationController为nil,且没办法通过添加到当前控制器来解决。

可以不使用懒加载,且将当前控制器作为属性传递给列表控制器就没有以上问题,但是有点僵硬!

你好,这个库是否考虑加入缓存?

看了你的 demo,发现有集成 WMPage,但是就用不了 JXCategory,所以有没有考虑加入控制器的缓存,类似 WM 那张操作,但是又能结合 JXCategory的使用?

设置属性「isDisableMainScrollInCeil = YES」临界点快速滚动,有点问题

我设置「isDisableMainScrollInCeil = YES」,然后我的头部高度是「1400」
我在临界点快速滚动,「isDisableMainScrollInCeil」不生效
截屏2020-08-06 上午10 29 16

我这个函数里面里面加了判断当前是否mainScrollView 是否已经滚动到临界值

// 临界点
            CGFloat criticalPoint = [self.mainTableView rectForSection:0].origin.y - self.ceilPointHeight;
            if(self.mainTableView.contentOffset.y >= criticalPoint){
                self.isMainCanScroll = NO;
                self.isListCanScroll = YES;
            }else{
                if (self.isAllowListRefresh && offsetY < 0 && self.isCeilPoint) {
                    self.isMainCanScroll = NO;
                    self.isListCanScroll = YES;
                }else {
                    self.isMainCanScroll = YES;
                    self.isListCanScroll = NO;

                    scrollView.contentOffset = CGPointZero;
                    if (self.isControlVerticalIndicator) {
                        scrollView.showsVerticalScrollIndicator = NO;
                    }
                }
            }

不知道这样会不会引起其他的问题,如果写错了,感谢指正

使用 uicollectionview 使用问题

你好,我发现使用uicollectionview ,如果数据源多的话没问题,数据源少的话会滑不动, 可以使用一个列表中只有一个数据源和20个数据源进行对比,滑到 menu 悬停的时候测试

方法使用版本判断问题

文件名 GKPageListContainerView.h
图片
contentInsetAdjustmentBehavior 这个属性,需要在iOS 11 系统才有,这个判断需要改一下。

self.childVCs里的controllers动态创建问题

由于需求原因,我需要动态创建childVCs,发现滚动紊乱

发现 [self configListViewScroll];在init里处理,就很容易到中第一次进来,设置不成功,建议单独把方法拉出来处理

运行报错

// 设置导航item偏移量
if (GKDeviceVersion >= 11.0 && !GKConfigure.gk_disableFixSpace) {
    self.layoutMargins = UIEdgeInsetsZero;
    
    for (UIView *subview in self.subviews) {
        if ([NSStringFromClass(subview.class) containsString:@"ContentView"]) {
            // 修复iOS11 之后的偏移
            subview.layoutMargins = UIEdgeInsetsMake(0, self.gk_navItemLeftSpace, 0, self.gk_navItemRightSpace);
            break;
        }
    }
}

这种做法在 iOS 13 中会导致崩溃,崩溃信息如下:

Client error attempting to change layout margins of a private view
  

试图更改私有视图的布局边距时出现错误

列表下拉刷新

使用列表下拉刷新时,如果cell的数量比较多,当滑到下面,然后下拉滑上去,当滑的速度很快,会瞬间回到顶部了,不知是不是就是这样设计的呢?

滚动问题

你好,问一个问题。我想简写一个类似的两个scrollview滚动的功能,当mainscrollview滑动到底部,再滑动的时候,childscrollview就不滚动了,代理也不走了。你是怎么做到的啊,我看了你的代码没看到关键点。

嵌套互动处理

// 处理左右滑动与上下滑动的冲突
- (void)horizonScrollViewWillBeginScroll;
- (void)horizonScrollViewDidEndedScroll;

代码里面提供的处理左右互动和上下滑动冲突的方法,感觉有些生硬,作者有没有更优雅的处理方式?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.