UISrollView

UISrollView是开发中最常见的控件,我们用它来展示各种界面,但是ScrollView的内部是怎么实现的呢,我写了一下代码研究了一下,大概原理是这样:

我们都知道每一个View都有一个CALayer,UIView的显示主要靠的是CALayer,每一个UIView在显示的时候都会对自己进行渲染,渲染的范围是根据bounds来确定的,但是当UIView被添加到父试图的时候需要确定位置,这时位置的确定是根据父视图的位置来确定的,即以父视图的原点来确定。如此我们看到的界面就显示出来了(即视图的光栅化和组合)。

视图在组合的时候应该在父视图上的位置

CompositedPosition.x = View.frame.origin.x - Superview.bounds.origin.x;

CompositedPosition.y = View.frame.origin.y - Superview.bounds.origin.y;

UIScrollView与普通的View最大的区别之处在于它是可以滑动的,并且内容不限于当前界面。此时我们如果把UIScrollView看成一个普通的View,那么其实这个View有一部分子视图是超出当前的视图界面的,此时就是一个不能滑动的ScrollView,那么如何让这个视图滑动呢?我们可以给这个视图添加一个移动手势,当我们移动的时候可以根据手势对ScrollView进行界面的改变,来展示那些超出屏幕的界面。如何操作呢,其实很简单,就是改变ScrollView的bounds,我们都知道子视图的位置的确定是根据父视图的原点来确定的,当我们改变父视图的原点之后,其实子视图的位置就改变了。此时我们再给改变父视图的原点加上动画就会出现类似滑动的效果。我们还可以根据手指移动的方向来确定视图滚动的方向。

contentOffset的最大值:

contentOffset.x = contentSize.width - bounds.size.width;

contentOffset.y = contentSize.height - bounds.size.height;

ScrollView有三个特别的属性,分别是contentSize、contentOffset和contentInsert,contentSize其实就是整个View的子视图的高度,由此来确定了整个view的滑动范围。 contentOffset其实就是每一次滑动的时候该变的原点的位置。我们可以自定义一个滑动的ScrollVIew,但是效果肯定没有系统的那么好了。至于contentInsert则是给scrollView添加一个额外的滚动区域。下面看一下它的具体使用:

当我们的手指开始触摸scrollview的时候,scrollview内部将会开始一个计时器,这个计时器判断以下情况:
(1)150ms内,触摸的手指没有任何动作,那么会把触摸的消息传递给subView去处理
(2)150ms内手指有明显的滑动,scrollView就会开始滚动,消息不会传递给子视图
(3)150ms内手指没有滑动,scrollview传递消息给子视图,但是之后手指开始滑动,scrollview传递touchesCancelled消息给子视图同时开始滚动。

scrollview有一个tracking属性,默认为YES,当150ms内手指发生了滑动,scrollView滑动,同时tracking属性变为NO,此时内部控件不会再响应触摸事件,当150ms内手指没有发生滑动,tracking属性继续保持为YES,内部控件可以响应触摸事件

scrollView还有一个属性delaysContentTouches,这个属性默认值为YES,如果设置为NO,那么无论手指滑动多快,触摸事件总会传递给内部控件。设置为NO可能会影响滑动性能。当为YES的时候,如果是在滑动那么内部控件不会响应触摸事件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,200评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,526评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,321评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,601评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,446评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,345评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,753评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,405评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,712评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,743评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,529评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,369评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,770评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,026评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,301评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,732评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,927评论 2 336

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,142评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,952评论 4 60
  • 以一种两个人都舒服的方式活着吧,
    紫绛阅读 117评论 1 0
  • 长大,没有多特别,大概都一样? w同学有个相交甚好的玩伴Q小姐,两个性格截然相反的人,但好像因为某些吸...
    喂不饱的瘦猪阅读 229评论 1 3
  • 之前被宋民国的表情包刷爆了朋友圈,被一个朋友推荐去看看《超人回来了》(后来中国引进以后拍了《爸爸回来了》),确实很...
    麦粒飞阅读 764评论 2 4