首先要明确的是,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 呢?

转载于:https://www.cnblogs.com/tanky/p/5705629.html

scrollView滚动原理相关推荐

  1. Android之ScrollView滚动布局控件使用以及显示新闻网页

    ScrollView滚动布局使用原理: ①滚动产生的条件是,里面的内容大于物理尺寸 ②ScrollView里面只有一个子元素,这个子元素就是一个线性布局LinearLayout,我们可以在线性布局中添 ...

  2. android ScrollView滚动距离和判断滚动停止状态

    今天很高兴,自己解决了判断ScrollView滚动停止的监听,现在分享给大家. 因为ScrollView没有像listView中的setOnScrollListener()监听,当然也就没有SCROL ...

  3. Android ScrollView嵌套ScrollView滚动的问题解决办法

    引用:http://mengsina.iteye.com/blog/1707464 http://fenglog.com/article.asp?id=449 Android ScrollView嵌套 ...

  4. Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming),请尊重他人的辛勤劳动成果,谢谢! 随着移动互联网的快速发展,它已经和我们的生活息息相关了,在 ...

  5. android scroller,深入理解Android中Scroller的滚动原理

    View的平滑滚动效果 什么是实现View的平滑滚动效果呢,举个简单的例子,一个View从在我们指定的时间内从一个位置滚动到另外一个位置,我们利用Scroller类可以实现匀速滚动,可以先加速后减速, ...

  6. Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

    Android对ScrollView滚动监听,实现美团.大众点评的购买悬浮效果 转:http://blog.csdn.net/xiaanming/article/details/17374599 很荣 ...

  7. ScrollView滚动到底部3种方案(巧解现实产品一个需求)

    在开发过程中,最近产品给了个需求.就不墨迹了,直接上需求图,然后在进行文本的讲解: 本分主要主要讲解第三种方法,并实现上面的需求. 先贴前2种实现ScrollView滚动到底部. 使用scrollTo ...

  8. 2022-03-09 Android布局 ScrollView滚动界面

    一.样例一:15个按钮竖直排列,一般的屏幕不可能全部显示,得用ScrollView滚动界面. <?xml version="1.0" encoding="utf-8 ...

  9. html无缝滚动原理,JavaScript实现图片无缝滚动效果

    图片无缝滚动就是图片一直不停的滚动,好像没有无穷无尽似的,实际上就是几张图片不停的循环,但是看不出有从最后面切换到最前面的效果,这就是无缝滚动,文字和图片都可以无缝滚动,这里介绍的是图片,文字是同样的 ...

  10. 【Unity3D-UGUI系列】(十二)ScrollView 滚动视图组件详解

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

最新文章

  1. Evaluation of long read error correction software 长读纠错软件的评估
  2. 详解在Linux下实现(彩色)进度条程序,并通过makefile进行编译.
  3. BigData:绘制2018年福布斯中国富豪榜人名坐标地图(解决多个人名显示在同一个家乡地点)
  4. VTK:相互作用之ImageClip
  5. 鹤峰:美丽的茶乡—— 山水篇
  6. 一步步编写操作系统 17 显存,显卡,显示器 上
  7. 4怎么修边_亦木良品阻燃板怎么样
  8. github里的默认域_恕我直言!你对Python里的import一无所知
  9. Wpf之无法获取鼠标点击事件
  10. Linux系统日志及screen工具
  11. Illustrator 教程,如何在 Illustrator 中更改角色的姿势?
  12. java3d/j3d源码位置
  13. JQuery的选择器对控件ID含有特殊字符的解决方法
  14. Java实现QQ邮件群发功能
  15. 升腾 linux管理密码,升腾Linux终端使用指南
  16. 【枚举的定义;枚举变量的定义、初始化和赋值】(学习笔记16--枚举)
  17. virbr0怎么关闭_kvm虚拟化关闭虚拟网卡virbr0的方法
  18. php gbk转拼音
  19. MYSQL数据库- 修改数据表名称、列名称
  20. 循环神经网络中的LSTM和GRU

热门文章

  1. (2015省赛系列--团体热身赛第二场)
  2. vb6 英文和中文长度不同_PPT里中文排版就是没英文好看?你怕是假酒喝多了…...
  3. java 原子类_没用过Java原子类?我来手写一个AtomicInteger
  4. cpu风扇声音大_小米游戏本风扇声音大的处理方法
  5. python 读取xlsx特定页_python 读取 Excel
  6. 【BZOJ1150】数据备份(堆/优先队列)
  7. 《C++(一)--类》
  8. 通过创建一条链来学习区块链 (1)
  9. html不用ajax怎么提交,停止HTML中JS AJAX功能提交按钮
  10. java timer.schedule如何控制执行次数_Java 面试——JIT详解