首页> 中国专利> 基于iOS系统中UITableView实现无限循环滚动选择的方法

基于iOS系统中UITableView实现无限循环滚动选择的方法

摘要

本发明公开了一种基于iOS系统中UITableView实现无限循环滚动选择的方法,创建UITableView和视图控制器并进行加载,添加两个代理;添加两个NSMutableArray,分别保存需要显示的原始数据和UITableView的数据源;添加整型变量记录滚动过程中的数据对象数量的变化及被选中对象的位置变化;设置UITableView数据源,初始化所有变量;设置滑动减速速率,关闭两端弹性效果,设置其dataSource;在视图控制器中重写相应的方法,更新记录滚动位置信息的变量的值,更新UITableView数据源,刷新UI界面即可。本发明实现了UITableView列表视图的循环滚动功能。

著录项

  • 公开/公告号CN105677366A

    专利类型发明专利

  • 公开/公告日2016-06-15

    原文格式PDF

  • 申请/专利权人 四川长虹电器股份有限公司;

    申请/专利号CN201610108213.5

  • 发明设计人 王斌;

    申请日2016-02-26

  • 分类号G06F9/44(20060101);

  • 代理机构51213 四川省成都市天策商标专利事务所;

  • 代理人李静云

  • 地址 621000 四川省绵阳市高新区绵兴东路35号

  • 入库时间 2023-12-18 15:32:47

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-01-11

    授权

    授权

  • 2016-07-13

    实质审查的生效 IPC(主分类):G06F9/44 申请日:20160226

    实质审查的生效

  • 2016-06-15

    公开

    公开

说明书

技术领域

本发明的实施方式涉及计算机技术与软件开发领域,更具体地,本发明的 实施方式涉及一种基于iOS系统中UITableView实现无限循环滚动选择的方法。

背景技术

随着互联网和移动应用技术的高速发展,智能手机和移动应用对于人们的 生活产生了深远的影响,涉及领域包括浏览互联网、交通、房产信息、购物、 智能家居等等各个方面,可以说,移动应用正在掌控着人们的日常生活。自从 苹果公司2013年推出iOS7系统,系统风格扁平化,引起了一阵人机交互风格转 变的潮流,同时伴随着用户对交互界面认知的提升,人性化、扁平化、多样化、 动态可视化、极致平滑的交互日益受到人们青睐。

对于iOS系统进行软件开发使用UITableView过程中,虽然它提供给开发 者可滚动的列表视图,但是它不能够提供循环滚动功能,当对于待选择对象数 据量比较庞大时,有时需要实现一个能够满足用户滑动到底部时能够快速选择 顶部cell对象,由于原生的TableView不能循环滚动,所以只有手动的重新滑动 到顶部,这大大降低了用户的体验。无论是最新的iOS9系统,还是以前的iOS 版本都存在这样的功能缺陷。

发明内容

本发明所解决的技术问题是,iOS系统不能提供具有循环滚动功能的列表 视图,当用户将列表滑动到底部时只能手动的重新滑动到顶部,大大降低了用 户的体验。且滚动视图的滚动速率太快会延缓dataSource的更新加载,太慢影响 用户体验。由于需要显示的对象数量不同,UITableView的dataSource的数据个 数选择也有问题,个数选择太多会增加应用内存负担,而太少会导致应用卡顿。 为了实现循环滚动,需要记录当前滚动结束后选中的位置,在滚动过程中数据 源的更新要求迅速而准确,特别是数据头尾交接部分,更新不及时会出现应用 界面卡顿或显示错误。

为解决上述的技术问题,本发明的一种实施方式采用以下技术方案:

一种基于iOS系统中UITableView实现无限循环滚动选择的方法,它包括 以下步骤:

步骤1:先创建一个类型为Plain的UITableView,再创建一个视图控制器, 然后在视图控制器上加载创建的UITableView,并添加代理 UITableViewDataSource、UITableViewDelegate;

步骤2:添加两个NSMutableArray,其中第一个保存需要显示的原始数据, 第二个为UITableView的数据源;

步骤3:添加五个全局性的整型变量,记录整个滚动过程中的数据对象数量 的变化及被选中对象的位置变化;

步骤4:在viewDidLoad方法中根据原始数据数量设置UITableView的数据 源,初始化步骤3中的所有变量;

步骤5:设置UITableView的滑动减速速率,关闭两端弹性效果,并且设置 其dataSource;

步骤6:在视图控制器中重写scrollViewDidEndDragging:willDecelerate:和 scrollViewDidEndDecelerating:方法,更新记录滚动位置信息的变量的值;

步骤7:根据步骤6中相关变量的值的变化,更新UITableView的数据源, 刷新UI界面,即可完成使用UITableView实现无限循环滚动选择功能。

上述基于iOS系统中UITableView实现无限循环滚动选择的方法中,步骤2 中所述两个NSMutableArray用NSArray替代。

上述基于iOS系统中UITableView实现无限循环滚动选择的方法中,步骤3 所述五个全局性的整型变量是具备全局修改读取特性的变量中的至少一种。

上述基于iOS系统中UITableView实现无限循环滚动选择的方法中,所述 步骤4和步骤5的具体步骤为:

(1)初始化allDataArray、dataSourceArray、allDataArrayCount;

(2)判断allDataArrayCount,若小于99,则通过方法addObjectsFromArray: 重复加载allDataArray中的数据,更新allDataArrayCount的值直到其大于99;

(3)设置defaultIndex为中间位置即49,selectedObjectAtAllDataArrayIndex 为2,dataSourceArrayCount为99,通过方法setContentOffset:设置tableView 的offest为(0,60*abs(defaultIndex-2));

(4)调用updateTableViewDatasource方法,更新tableView的数据源 dataSourceArray;

(5)设置tableView的bounces为NO,decelerationRate为0.3,delegate和 dataSource为self,将tableView加载到viewController上。

上述基于iOS系统中UITableView实现无限循环滚动选择的方法中,步骤6 所述scrollViewDidEndDragging:willDecelerate:方法的实现步骤为:

(1)当decelerate为NO时,判断scrollView.contentOffset.y%60是否大 于30,若大于则设置scrollView.contentOffset的值为(0, ((scrollView.contentOffset.y)/60+1)*60),否则设置为(0, ((scrollView.contentOffset.y)/60)*60;

(2)更新currentIndex的值为scrollView.contentOffset.y/60+2;

(3)根据currentIndex与defaultIndex的值得到tableView滚动了多少 行,新增一个int型临时变量newSelectedObjectIndex,其值为 selectedObjectAtAllDataArrayIndex+(currentIndex-defaultIndex);当 newSelectedObjectIndex大于了原始数据的元素个数allDataArrayCount–1时,更 新selectedObjectAtAllDataArrayIndex的值为newSelectedObjectIndex– allDataArrayCount,如果不大于而且newSelectedObjectIndex小于0,那么 selectedObjectAtAllDataArrayIndex值为allDataArrayCount+ newSelectedObjectIndex,否则值为newSelectedObjectIndex;

(4)调用方法updateTableViewDatasource和updateTableView,更新 tableView的数据源和UI界面。

上述基于iOS系统中UITableView实现无限循环滚动选择的方法中,步骤6 所述scrollViewDidEndDecelerating:方法的实现步骤为:

(1)当scrollView.dragging为NO时,判断 scrollView.contentOffset.y%60是否大于30,若大于则设置 scrollView.contentOffset的值为(0,((scrollView.contentOffset.y)/60+1)*60),否则 设置为(0,((scrollView.contentOffset.y)/60)*60;

(2)更新currentIndex的值为scrollView.contentOffset.y/60+2;

(3)根据currentIndex与defaultIndex的值得到tableView滚动了多少 行,新增一个int型临时变量newSelectedObjectIndex,其值为 selectedObjectAtAllDataArrayIndex+(currentIndex-defaultIndex);当 newSelectedObjectIndex大于了原始数据的元素个数allDataArrayCount–1时,更 新selectedObjectAtAllDataArrayIndex的值为newSelectedObjectIndex– allDataArrayCount,如果不大于而且newSelectedObjectIndex小于0,那么 selectedObjectAtAllDataArrayIndex值为allDataArrayCount+ newSelectedObjectIndex,否则值为newSelectedObjectIndex;

(4)调用方法updateTableViewDatasource和updateTableView,更新 tableView的数据源和UI界面。

上述基于iOS系统中UITableView实现无限循环滚动选择的方法中,所述 updateTableViewDatasource方法的实现步骤为:

(1)移除dataSourceArray的所有内容对象;

(2)使用for循环,循环变量i从defaultIndex递减到0,给 dataSourceArray重新添加前部分对象元素,在循环体中使用三个整型临时变量: offestIndex、sumIndex和theObjectAtAllDataArrayIndex,offestIndex值为 defaultIndex–i,sumIndex值为selectedObjectAtAllDataArrayIndex–offestIndex; 当sumIndex小于0时,theObjectAtAllDataArrayIndex的值为allDataArrayCount+ sumIndex,反之其值为sumIndex;最后将allDataArray中的第 theObjectAtAllDataArrayIndex个对象通过方法insertObject:atIndex:插入到 dataSourceArray中index为0的位置;

(3)再次使用for循环给dataSourceArray重新添加后部分对象元素, 循环变量j从defaultIndex+1递增到dataSourceArrayCount–1,在循环体中声明 两个整型临时变量sumIndex和theObjectAtAllDataArrayIndex,sumIndex的值为 j-defaultIndex+selectedObjectAtAllDataArrayIndex,当sumIndex大于 allDataArrayCount–1时,theObjectAtAllDataArrayIndex的值为sumIndex- (allDataArrayCount-1)–1,反之其值为sumIndex,最后给dataSourceArray通过 addObject添加allDataArray中的第theObjectAtAllDataArrayIndex个对象。

上述基于iOS系统中UITableView实现无限循环滚动选择的方法中,所述 updateTableView方法的实现步骤为:

(1)对tableView发送reloadData方法,重新加载tableView数据源中 的数据;

(2)对tableView发送setContentOffset:animated:方法设置offest为(0, 60*abs(defaultIndex-2)),其中的动画效果animated为NO。

上述基于iOS系统中UITableView实现无限循环滚动选择的方法中,所述 无限循环滚动选择是指滚动到原始数据中的最后一个数据对象后仍能够继续滚 动,后续将从第一个数据对象按照指定的顺序继续滚动。

上述基于iOS系统中UITableView实现无限循环滚动选择的方法中,所述 变量的命名仅为了方便形象说明,不局限于上述变量命名。

与现有技术相比,本发明的有益效果之一是:本发明提供了一种基于iOS系 统中UITableView实现循环滚动选择菜单的方法,不受在移动设备屏幕界面上显 示的UITableView的cell个数影响,让用户能够在列表的待选择对象数量比较多 的情况下快速滚动到想要选择的对象的位置,减少用户不必要的滑动操作,解 决了UITableView不能循环滚动并没有客观显示选中的对象,UIPickerView不能 平面循环滚动的问题,使软件设计得更加人性化,提升了用户的体验。

附图说明

图1为本发明基于iOS系统中UITableView实现无限循环滚动选择的方法 的流程图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实 施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅 仅用以解释本发明,并不用于限定本发明。

实施例

通常情况下对于UITableView来说都是数据源固定,通过上下滚动进行数据 展示的,然后发现如果它的数据源随着滚动而实时改变,在滑动结束后改变其 偏移值,那么这个UITableView就可以进行无限循环滚动了,首先让UITableView 的初始位置偏移到整个内容的中间部分,使其初始便可以上下滚动,然后通过 两个代理方法scrollViewDidEndDragging:willDecelerate:和 scrollViewDidEndDecelerating:,在滚动结束后立即更新其数据源,重新设置偏 移值,刷新UI界面后,使UITableView滚动变换到当前用户看到的界面,而这些 用户都是察觉不到的,便能让用户感觉到这个UITableView可以无限循环的滚 动。

本发明实现UITableView无限循环滚动的操作步骤如图1所示,主要包括以 下步骤:步骤1:首先创建一个类型为Plain的UITableView,再创建一个视图控 制器,在视图控制器上加载创建的UITableView,并添加代理 UITableViewDataSource、UITableViewDelegate;步骤2:添加两个 NSMutableArray,其中第一个保存需要显示的原始数据,第二个为UITableView 的数据源;步骤3:添加五个全局性的整型变量,记录整个滚动过程中的数据对 象数量的变化及被选中对象的位置变化;步骤4:在viewDidLoad方法中根据原 始数据数量设置UITableView的数据源,初始化步骤3中的所有变量;步骤5:设 置UITableView的滑动减速速率,关闭两端弹性效果,并且设置其dataSource; 步骤6:在视图控制器中重写scrollViewDidEndDragging:willDecelerate:和 scrollViewDidEndDecelerating:方法,更新记录滚动位置信息的变量的值;步骤7: 根据步骤6中相关变量的值的变化,更新UITableView的数据源,刷新UI界面, 即可完成使用UITableView实现无限循环滚动选择功能。

下面对上述各个步骤进行更加清晰完整的描述。

步骤1:在Xcode中创建一个新的工程,创建一个视图控制器 (UIViewController),在这个视图控制器上创建并加载一个UITableView实例 tableView,类型为Plain,并添加代理UITableViewDataSource、 UITableViewDelegate。

步骤2:在视图控制器下添加两个可变数组(NSMutableArray),其中一个 保存所有的数据对象allDataArray,另一个为tableView的数据源dataSourceArray。

步骤3:在视图控制器下添加5个全局性的整型变量形如:defaultIndex、 currentIndex、selectedObjectAtAllDataArrayIndex、allDataArrayCount、 dataSourceArrayCount,其中defaultIndex表示在发生滑动前当前选中对象在 dataSourceArray中的位置,currentIndex表示滑动后当前选中对象在 dataSourceArray中的位置,selectedObjectAtAllDataArrayIndex表示所选中对象在 原始数据allDataArray中的位置,在每次滑动结束后都需要更新这个值, allDataArrayCount表示所有数据对象个数,dataSourceArrayCount则表示 tableView的dataSource的数据对象个数,这两个主要用于保证数据显示的正确 性。

步骤4:在viewDidLoad方法中设置tableView的数据源及给各个变量赋初始 值,为了让tableView能够顺滑的滚动并且保持滚动过程的数据正确性,需要保 证dataSourceArrayCount等于99,若allDataArray的对象个数不足99,那么只需 要将其重复加载即可,具体方法如下:

(1)初始化allDataArray、dataSourceArray、allDataArrayCount;

(2)判断allDataArrayCount,若小于99,则通过方法addObjectsFromArray: 重复加载allDataArray中的数据,更新allDataArrayCount的值直到其大于99;

(3)当allDataArrayCount大于99时,设置defaultIndex为中间位置即49, selectedObjectAtAllDataArrayIndex为2,dataSourceArrayCount为99,通过方法 setContentOffset:设置tableView的offest为(0,60*abs(defaultIndex-2));

(4)调用updateTableViewDatasource方法,更新tableView的数据源 dataSourceArray;

(5)设置tableView的bounces为NO,decelerationRate为0.3,delegate和 dataSource为self,最好将tableView加载到viewController上。

步骤5:配置tableView,在步骤S4中已做好了tableView的部分属性设置, 包括关闭两端弹性效果设置bounces为no,设置滚动的减速速率decelerationRate 为0.3,设置delegate和dataSource为UITableView所在视图控制器;之后需要 通过UITableViewDataSource的numberOfSectionsInTableView:方法设置 TableView只有1个section,通过方法tableView:numberOfRowsInSection:设置 tableView的cell个数为_dataSourceArray.count,通过UITableViewDelegate的 tableView:heightForRowAtIndexPath:方法设置cell的高度为tableView高度的五 分之一,通过方法tableView:cellForRowAtIndexPath:配置每个cell的内容。

步骤6包括步骤6-1和步骤6-2,如下:

步骤6-1:重写scrollViewDidEndDragging:willDecelerate:方法,保证 tableView在慢速滚动时能够及时更新数据源,首先由滑动后的偏移值得到当前 选中对象在数据源中的位置currentIndex,再根据之前保存的上一次的位置 defaultIndex,即可得到当前选中对象在原始数据的位置 selectedObjectAtAllDataArrayIndex,最后即可重新得到tableView新的数据源 dataSourceArray,重写scrollViewDidEndDragging:willDecelerate:方法具体如下:

(1)当decelerate为NO时,判断scrollView.contentOffset.y%60是否大 于30,若大于则设置scrollView.contentOffset的值为(0, ((scrollView.contentOffset.y)/60+1)*60),否则设置为(0, ((scrollView.contentOffset.y)/60)*60;

(2)更新currentIndex的值为scrollView.contentOffset.y/60+2;

(3)根据currentIndex与defaultIndex的值得到tableView滚动了多少 行,可新增一个int型临时变量newSelectedObjectIndex,其值为 selectedObjectAtAllDataArrayIndex+(currentIndex-defaultIndex);当 newSelectedObjectIndex大于了原始数据的元素个数allDataArrayCount–1时,更 新selectedObjectAtAllDataArrayIndex的值为newSelectedObjectIndex– allDataArrayCount,如果newSelectedObjectIndex不大于原始数据的元素个数 allDataArrayCount–1而且newSelectedObjectIndex小于0,那么 selectedObjectAtAllDataArrayIndex值为allDataArrayCount+ newSelectedObjectIndex,否则值为newSelectedObjectIndex;

(4)调用方法updateTableViewDatasource和updateTableView,更新 tableView的数据源和UI界面。

步骤6-2:和步骤6-1相似的,重写scrollViewDidEndDecelerating:方法, 当tableView在快速滑动时,得到新的currentIndex,根据保存的defaultIndex, 即可得到当前选中对象在原始数据的位置selectedObjectAtAllDataArrayIndex,最 后即可重新得到tableView新的数据源dataSourceArray,重写 scrollViewDidEndDecelerating:方法如下:

(1)当scrollView.dragging为NO时,判断 scrollView.contentOffset.y%60是否大于30,若大于则设置 scrollView.contentOffset的值为(0,((scrollView.contentOffset.y)/60+1)*60),否则 设置为(0,((scrollView.contentOffset.y)/60)*60;

(2)更新currentIndex的值为scrollView.contentOffset.y/60+2;

(3)根据currentIndex与defaultIndex的值得到tableView滚动了多少 行,可新增一个int型临时变量newSelectedObjectIndex,其值为 selectedObjectAtAllDataArrayIndex+(currentIndex-defaultIndex);当 newSelectedObjectIndex大于了原始数据的元素个数allDataArrayCount–1时,更 新selectedObjectAtAllDataArrayIndex的值为newSelectedObjectIndex– allDataArrayCount,如果newSelectedObjectIndex不大于原始数据的元素个数 allDataArrayCount–1而且newSelectedObjectIndex小于0,那么 selectedObjectAtAllDataArrayIndex值为allDataArrayCount+ newSelectedObjectIndex,否则值为newSelectedObjectIndex;

(4)调用方法updateTableViewDatasource和updateTableView,更新 tableView的数据源和UI界面。

上述步骤4、步骤6、步骤7均调用了方法updateTableViewDatasource,用 以更新tableVide数据源dataSourceArray,方法updateTableViewDatasource具体 实现如下:

(1)移除dataSourceArray的所有内容对象;

(2)使用for循环,循环变量i从defaultIndex递减到0,给 dataSourceArray重新添加前部分对象元素,在循环体中使用三个整型临时变量: offestIndex、sumIndex和theObjectAtAllDataArrayIndex,offestIndex值为 defaultIndex–i,sumIndex值为selectedObjectAtAllDataArrayIndex–offestIndex; 当sumIndex小于0时,theObjectAtAllDataArrayIndex的值为allDataArrayCount+ sumIndex,反之其值为sumIndex;最后将allDataArray中的第 theObjectAtAllDataArrayIndex个对象通过方法insertObject:atIndex:插入到 dataSourceArray中index为0的位置;

(3)再次使用for循环给dataSourceArray重新添加后部分对象元素, 循环变量j从defaultIndex+1递增到dataSourceArrayCount–1,在循环体中声明 两个整型临时变量sumIndex和theObjectAtAllDataArrayIndex,sumIndex的值为 j-defaultIndex+selectedObjectAtAllDataArrayIndex,当sumIndex大于 allDataArrayCount–1时,theObjectAtAllDataArrayIndex的值为sumIndex- (allDataArrayCount-1)–1,反之其值为sumIndex,最后给dataSourceArray通过 addObject添加allDataArray中的第theObjectAtAllDataArrayIndex个对象。

上述步骤6-1和步骤6-2均调用的方法updateTableView,用以刷新UI界面, 方法updateTableView具体实现如下:

(1)对tableView发送reloadData方法,重新加载tableView数据源中的数据;

(2)对tableView发送setContentOffset:animated:方法设置offest为(0,60* abs(defaultIndex-2)),其中的动画效果animated为NO。

步骤7:根据步骤6中相关变量的值的变化,更新UITableView的数据源, 刷新UI界面,即可完成使用UITableView实现无限循环滚动选择功能。

尽管这里参照本发明的解释性实施例对本发明进行了描述,但是,应该理 解,本领域技术人员可以设计出很多其他的修改和实施方式,这些修改和实施 方式将落在本申请公开的原则范围和精神之内。更具体地说,在本申请公开的 范围内,可以对主题组合布局的组成部件和/或布局进行多种变型和改进。除了 对组成部件和/或布局进行的变型和改进外,对于本领域技术人员来说,其他的 用途也将是明显的。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号