UITableView分组冻结的研究与实现浅析
来源:互联网 发布:unity linux 运行效率 编辑:程序博客网 时间:2024/05/29 17:35
功能描述
当我们使用iphone手机通讯录,手机qq滑动联系人的时候。有一个细节大家可能已经忽略,即“联系人分组”控件在向屏幕上方滑动时,超过屏幕的高度,就冻结到屏幕最上端。方便用户确定当前浏览的是哪个分组。当下面的分组上来时候,又会当前冻结的窗口顶上去,它自己又实现冻结!这就是分组冻结功能。
这篇两年前都应该写的博客,直到今天才写出来,才发现当初的设计和思路已经模糊,只能看代码来分析了。所以这篇文章只是回忆一下当初踊跃的思路。
为了能够说明白这个东西,再举一个例子。在使用excel的时候,冻结窗口的功能:固定了第一行(通常是标题行)方便用户对照标题和数据。下面这个gif图片展示了冻结分组的效果。注意“测试”这个分组的效果,当cell移动的时候,它并没有移动,而是定在哪儿了!
2012年,笔者在Symbian平台上实现了分组冻结的功能(纯自绘的);由于笔者目前在开发iOS应用,以iOS平台中tableview为例,在使用它的使用,我们必定要实现下面两个函数,分别用来设置section和cell的view。其中section就具备冻结功能:
tableView: viewForHeaderInSection:
tableView: cellForRowAtIndexPath:
笔者还不太清楚iOS 中的tableview是如何实现分组冻结的,因为iOS已经做的很完善了。
下面详细说一下如何在【自绘控件】环境下,实现分组冻结功能。
1. 传统的tableview中,section和cell是一并绘制的,现将section和cell的绘制分开
既然section能够冻结,那么section在UI层次中的顺序关系就是:section高于cell,这样section冻结的时候,section才能正常显示;或者说将section的控件最后add到view的控件数组中。下面我们看看在绘制控件的时候的先后层次:
上面这个图是飞信塞班版本中UI的层次结构,主要说明UI的绘制是分层的。
2. 设定一个Y值上限,通常是tableview的上沿的Y值
设定一个Y值,冻结分组的时候,最上端是多少,这也是主要的参数了。例如下面的代码
iFreezeEngine = FreezeEngine::NewL(this);
iFreezeEngine->SetFreezeLine(Area().iTl.iY);//topLeft.Y
3. 建立一个FreezeEngine的类和CCanFreezeControl类
tableview由FreezeEngine和多个cell组成。FreezeEngine管理这多个CCanFreezeControl。cell和CCanFreezeControl都继承自Control基类。如果把FreezeEngine去掉就是正常的view和control的关系了。
FreezeEngine类中两个重要属性是:冻结线,可冻结控件数组。
TInt iFreezeLine;
RPointerArray<CCanFreezeControl> iCanFreezeControlArray;
● CCanFreezeControl类
该类中有三个重要参数,根据这三个参数可以计算出:何时需要冻结?何时从冻结的地方回来。
TInt iFreezeOffset; //是一个负数,在这个区间 [-iGroupItemHeight,0]TInt iFreezeAccumulate; //是一个倍数,iGroupItemHeight的倍数。
TInt iGroupItemHeight; //一个分组的高度
还有一个最重要的函数TBool CCanFreezeControl::CalcFreezeOffset(const TRect & aSrcRect,TRect& aDesRect)负责计算,当分组接近冻结时候的计算,已经冻结时候的计算。
4. 可冻结控件的冻结状态
5. 还要实现分组控件的按键点击
由于冻结的分组扔需要响应事件,所以,当屏幕点击到“冻结分组”的时候,需要转换成分组实际的坐标进行匹配,才能确定是否响应这个点击。
最后,由于笔者正致力于iOS开发,这些UI基础功能,iOS系统已经做到极致了,所以。这篇博文只是来回忆一下symbian的代码。
- UITableView分组冻结的研究与实现浅析
- UITableView的简单分组
- 自定义UITableView,实现cell的三级分组展开收起
- swift uitableview 中实现分组,将cell分组显示,类似微信的好友界面
- 浅析电力企业生产管理系统封装集成技术的研究与实现,电力论文,工学论文
- VC++实现进程冻结与解冻
- VC++实现进程冻结与解冻
- UITableView——实现汽车分组展示
- 【Demo】UITableView实现分组可折叠下拉列表
- IOS UITableView分组与索引分区实例
- IOS UITableView分组与索引分区实例
- UITableView---分组
- UICollectionReusableView的用法,类似UITableView的分组
- wps实现冻结首行的方法
- JTable冻结列的简单实现
- jquery实现table的冻结列
- Android Listview 实现Ios UItableView的分组模块功能 基础Adapter
- JavaScript屏幕的冻结与解冻
- Service如何关闭启动自己的Activity
- Java中volatile关键字学习笔记
- Java中shallow clone 与deep Clone的区别
- boost::weak_ptr
- Application request route负载均衡算法解释
- UITableView分组冻结的研究与实现浅析
- 面试会考的动态规划DP总结
- Quick-cocos2d-x 与COCOS2DX 区别
- 8款强大的CSS3/HTML5动画及应用源码
- 关于thinkphp关联模型的效率问题
- iOS应用跳转至app store 评分页(包括iOS7前后两种)
- 如何从一名测试员转型为管理人员
- android studio jar包、so文件、zip包等资源文件引入
- 面试准备之常见上机题目搜罗(三)