IOS开发(六):滚动视图UIScrollView

一、概述

在滚动过程当中,其实是在修改坐标原点。

当手指触摸后,ScrollView会暂时拦截触摸事件,并开启一个计时器。假如在计时器到点后没有发生手指移动事件,那么ScrollView发送、tracking events到被点击的subview;假如在计时器到点前发生了移动事件,那么ScrollView取消tracking,自己发生滚动。

1、初始化

UIScrollView *sv = [[UIScrollView alloc] initWithFrame:CGMakeSize(0.0,0.0,self.view.frame.size.with,600)];

然后可以设置一些属性,以及其它相关的处理。


二、深入分析
UIScrollView

(这部分来自参考资料,仅供参考,也不是很详细。)

-----------------------------------------------------------------------------------------------

1、由于移动设备自身的限制,当某些视图滚出可见范围时,应该如何处理,如何重用可视的空间,减少内存的开销。

2、UIScrollView是UITableView和UITextView的超类。它的核心理念:UIScrollView是一个可以在内容视图之上调整自己原点坐标的视图。它根据自身框架的大小,裁剪视图中的内容。通常框架是和应用程序窗口一样大。可以根据手指的移动,调整原点的位置,这个原点位置就是滚动视图的偏移量。展示内容的视图会根据滚动视图的原点位置,开始绘制视图的内容。UIScrollView必须知道内容视图的大小,以便于知道什么时候停止,一般当滚动出内容的边界时,它就返回了。

UIScrollView必须知道一个触摸信号是打算滚动还是打算跟踪里面的子视图。为了达到这个目的,它临时中断了一个touch-down事件,通过建立一个定时器,在定时器开始行动之前,看是否触摸的手指做了任何的移动。假如定时器运行中没有任何的大的位置改变,UIScrollView就发送一个跟踪事件给触摸的子视图;如果在定时器消失前,用户拖动手指足够远,UIScrollView就取消子视图的任何跟踪事件,而滚动它自己。

子类可以通过重载touchesShouldBegin:withEvent:inContentView:、pagingEnabled和touchesShouldCancelInContentView:方法,从而影响滚动视图的滚动手势。

UIScrollView类有一个delegate,需要适配的协议是UIScrollViewDelegate。为了缩放和平铺工作,代理必须实现viewForZoomingInScrollView:和scrollViewDidEndZooming:withView:atScale:方法。

UIScrollView对象中,不应该嵌入任何UIWebView和UITableView,否则会出现一些异常情况,因为两个对象的触摸事件可能被混合,从而被错误的处理。

--------------------------------------------------------------------------------------------------

三、UIScrollView简单使用

1、拖动一个UIScrollView控件到IB,在上面添加6个标签。设置第六个标签在可见范围外,可以直接设置坐标值。如下图所示:

2、将UIScrollView添加输出口,设置为theScroller,其它保留默认。

3、支持滚动

为给可滚动视图添加滚动功能,需要将属性contentSize设置为一个CGSize值。CGSize是一个简单的C语言数据结构,它包含高度和宽度,可使用函数CGSize(<with>,<height>)创建一个这样的对象。

例如要告诉该可滚动视图(theScroller)可水平和垂直分别滚动到280点和600点,可在viewDidLoad方法中编写如下代码:

self.theScroller.contentSize = CGSizeMake(280.0,600.0);

注:我在测试的时候,没有添加该行代码,但是运行的时候仍能滚动。。。希望有高手解答下。

补充:

原来开始我认为的滚动,只是bounces(橡皮筋)属性和IOS 6新增的AutoLayout属性的作用,设置了AutoLayout,而bounces属性默认是true的,当我按住键盘不放,往下滚动的时候,确实可以看到第六个标签。

所以真正要让ScrollView能够滚动,还是需要去设置contentSize的。

4、运行效果

原文地址:https://www.cnblogs.com/xsjayz/p/3012623.html