scrollView滚动原理
首先要明确的是,scrollview 其实和普通的 view 并没有多大的差别,只不过给它加上了一些手势和约定。
我们知道,要让一个 scrollview 能够滚动的方法是设置它的 contentSize 的宽或者高或者同时比自己的 frame 大。
想一想为什么要这样做?
首先,scrollview 被苹果开发出来是为了通过滚动来显示比自己的 size 更多的内容,如果它的 contentSize 比自己都小,就没有滚动的必要了。
但实际上,scrollview 并没有滚动,当你在“拖动” scrollview 时,你其实是在改变 scrollview 的 bounds.origin。
那么什么是 bounds 呢? bounds 和 frame 又有什么关系呢?
bounds 是一个 view 自身的坐标系,它的作用是规定它自身的内容从什么位置开始绘制。 frame 是一个 view 相对于自己父视图的位置。它们是完全不相关联的。
你已经知道的是,当你“拖动” scrollview 时, scrollview 的代理会收到scrollViewDidScroll: 的消息,在里面打印 scrollview 的 contentOffset 的值,这个值会随着你的“拖动”不停的变化。这时候,尝试打印一下 scrollview 的 bounds.origin 的值,你会发现,这个值竟然和前面的值一样。contentOffset 只是为了更好的说明情况给 bounds.origin 换了个名字而已。
contentSize 只是抽象的概念,它规定的其实是 scrollview 的 bounds.origin 能够变化的范围。
理解到这里,像其他的 scrollview 的特性,例如 bounces 等,都可以得到解释。
scrollview 还增加了一个特性,contentInset,它用来 scrollview 增加额外的滚动范围,其实就是把 bounds.origin 的变化范围扩大了。当你给 scrollview 设置 contentInset 的时候,你会发现,它的 contentSize 并没有改变。
一般情况下,你并不会通过直接设置 contentSize 来达到你“滚动”的目的,因为当你想让 scrollview 的所有内容都能够通过“滚动”的方式显示时,你很难计算子视图整体的大小, 因为子视图在当时有可能还没决定自己的大小。所以通常来说,你会用 scrollview 的子类,例如 tableview 和 textview。他们会根据自己内容的大小自动的设置 scrollview 的 contentSize,以便包裹所有内容。当然他们有自己不同的使用场景。
同样,当我们试图实现类似的功能时,我们该怎么做呢?
这里我们会用到 Auto layout。只要 scrollview 的子视图确定了自己的大小,那么 scrollview 的 contentSize 就确定了,scrollable area 也就确定了。
这里的最佳实践是首先在 scrollview 上添加一个四周的 edge constraints 与 scrollview 间距为0的 content view,接下来,把你想要的子视图添加上去并且设置好相应的约束就可以了。
当我们实现上面的功能后,如果我们还想通过增加一些额外的滚动空间来实现例如防止键盘遮挡视图、下拉刷新或者上拉加载的功能时,我们就可以通过简单的设置 scroll view 的 contentInset 来实现,而不必从一开始就去关心 contentSize 的大小。
问题思考:scrollView 的代理有 scrollViewDidScrollToTop: 的方法来通知 scrollView 滑动到了顶部,想一想它的原理是什么?如何知道 scrollView 滑动到底部了呢?如果还要加上考虑 contentOffset 和 contentInset 呢?
scrollView滚动原理的更多相关文章
- View的滚动原理简单解析
一直对View的滚动了解的不深,说明确了吧也能说出个所以然来,所以我就花了点时间做了一个小小的总结,言归正传,view的滑动分为下面三种: 1)View本身不滚动,指滚动View的内容,这也是View ...
- tableView和scrollView滚动起冲突
tableView和scrollView滚动起冲突 tableView也是继承的scrollView,所以在滚动的时候也会触发scrollView的代理方法,在scrollViewDidScroll中 ...
- android ScrollView滚动距离和判断滚动停止状态
今天很高兴,自己解决了判断ScrollView滚动停止的监听,现在分享给大家. 因为ScrollView没有像listView中的setOnScrollListener()监听,当然也就没有SCROL ...
- scrollView滚动(通过代码)
平时的开发中可能会要求scrollview滚动,一般的方法时通过scrollview.scrollto(0,1000);来实现,但是注意这个方法是在scrollview停止动画之后才能执行的,因为如果 ...
- Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...
- [Unity]Unity开发NGUI代码实现ScrollView(滚动视图)
Unity开发NGUI代码实现ScrollView(滚动视图) 下载NGUI包 导入NGUI3.9.1版本package 链接: http://pan.baidu.com/s/1mgksPBU 密码: ...
- Android ScrollView嵌套ScrollView滚动的问题解决办法
引用:http://mengsina.iteye.com/blog/1707464 http://fenglog.com/article.asp?id=449 Android ScrollView嵌套 ...
- javascript无缝滚动原理
相比之下,无缝拼接能避免切换时出现空白,使用户体验更好! 无缝滚动原理: 制作一个双胞胎,内容跟主体内容一致,样式一致,如果横向排列则并排,当切换的时候,就可以弥补主体空白的地方,其他按普通循环操作即 ...
- Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming),请尊重他人的辛勤劳动成果,谢谢! 随着移动互联网的快速发展,它已经和我们的生活息息相关了,在 ...
随机推荐
- 8.dns服务的搭建
一.DNS的相关配置文件 /etc/hosts 本地主机列表 /etc/nssswitch.conf 本地主机查询方式 /etc/host.conf /etc/resolv.conf ...
- Junit mockito解耦合测试
Mock测试是单元测试的重要方法之一. 1.相关网址 官网:http://mockito.org/ 项目源码:https://github.com/mockito/mockito api:http:/ ...
- 关于Retinex图像增强算法的一些新学习。
最近再次看了一下IPOL网站,有一篇最近发表的文章,名字就是Multiscale Retinex,感觉自己对这个已经基本了解了,但还是进去看了看,也有一些收获,于是抽空把他们稍微整理了下,原始文章及其 ...
- ongl(原始类型和包装类型)
原始类型和包装类型 //首先创建两个实体类 user 和 address user中包含address package cn.jbit.bean; public class User { //用户类 ...
- PHP代码
1 <html> <head> <meta http-equiv="content-type" content="text/h ...
- mysql 文件导入方法总结
数据导入3三种方法 一.phpMyAdmin 限制大小:2M 1.创建数据库 2.导入.sql或.sql.zip文件 大数据导入方法一:http://jingyan.baidu.com/article ...
- [LeetCode] Partition List 划分链表
Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...
- [LeetCode] Add Two Numbers 两个数字相加
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
- .NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库
今天微软正式发布了ASP.NET 5 RC1(详见Announcing ASP.NET 5 Release Candidate 1),.NET跨平台迈出了关键一步. 紧跟这次RC1的发布,我们成功地将 ...
- [网站性能1]对.net系统架构改造的一点经验和教训
文章来源:http://www.admin10000.com/document/2111.html 在互联网行业,基于Unix/Linux的网站系统架构毫无疑问是当今主流的架构解决方案,这不仅仅是因为 ...