UIScrollView

UIScrollView
一、官方文档介绍
功能:为显示大于手机频幕的内容提供支持,它允许用户通过手势滑动或捏合,来显示内容。
概述:UIScrollView是UITableView和UITextView的父类。
UIScrollView的核心理念是,它是一个可以在内容视图之上,调整自己原点位置的视图。它根据自身框架的大小,剪切视图中的内容,通常框架是和应用程序窗口一样大。一个滚动的视图可以根据手指的移动并且适当的调整原点的位置。滚动视图根据滚动视图的原点位置展示内容的视图(这个原点位置就是滚动视图的偏移量)。ScrollView本身不能绘制,除非显示水平和竖直的滚动指示器。滚动视图必须知道内容视图的大小,以便于知道什么时候停止;一般而言,当滚动出内容的边界时,它就返回了。
某些对象是用来管理内容显示如何绘制的,这些对象应该是管理如何平铺显示内容的子视图,以便于没有子视图可以超过屏幕的尺寸。就是当用户滚动时,这些对象应该恰当的增加或者移除子视图。
因为滚动视图没有滚动条,它必须知道一个触摸信号是打算滚动还是打算跟踪里面的子视图。为了达到这个目的,它通过建立一个定时器,临时中断了一个touch-down的事件,在定时器触发之前,看是否触摸的手指做了任何的移动。假如定时器执行期间时,没有任何的大的位置改变,滚动视图就发送一个跟踪事件给触摸的子视图。如果在定时器消失前,用户拖动他们的手指足够的远,滚动视图取消子视图的任何跟踪事件,滚动它自己。子类可以重载touchesShouldBegin:withEvent:inContentView:,pagingEnabled,和touchesShouldCancelInContentView:方法,从而影响滚动视图的滚动手势。
一个滚动视图也可以控制一个视图的缩放和平铺。当用户做捏合手势时,滚动视图调整偏移量和视图的比例。当手势结束的时候,管理视图内容显示的对象,就应该恰当的升级子视图的显示。当手势在处理的过程中,滚动视图不能够给子视图,发送任何跟踪的调用。
UIScrollView类有一个delegate,需要适配的协议是UIScrollViewDelegate。为了缩放和平铺工作,代理必须实现viewForZoomingInScrollView:和scrollViewDidEndZooming:withView:atScale:方法。另外,最大和最小缩放比例应该是不同的。
重要的提示:在UIScrollView对象中,你不应该嵌入任何UIWebView和UITableView。假如这样做,会出现一些异常情况,因为2个对象的触摸事件可能被混合,从而错误的处理。
这些都是官方API的解释,
重点理解UIScrollView怎么来控制手势的。可以由canCancelContentTouches这个方法的运用来解释UIScrollView如何控制手势的。
假如你设置canCancelContentTouches为YES,那么当你在UIScrollView上面放置任何子视图的时候,当你在子视图上移动手指的时候,UIScrollView会给子视图发送touchCancel的消息。而如果该属性设置为NO,ScrollView本身不处理这个消息,全部交给子视图处理。
那么这里就有疑问了,既然该属性设置未来NO了,那么岂不是UIScrollView不能处理任何事件了,那么为何在子视图上快速滚动的时候,UIScrollView还能移动那。这个一定要区分前面所说的UIScrollView中断touch-Down事件,开启一个定时器。我们设置的这个cancancelContentTouches属性为NO时,只是让UIScrollView不能发送cancel事件给子视图。而前面所说的时,中断touch-down事件,和取消touch事件是俩码事,所以当快速在子视图上移动的时候,当然可以滚动。但是如果你慢速的移动的话,就可以区分这个属性了,假如设定为YES,在子视图上慢速移动也可以滚动视图,但是如果为NO 。因为UIScrollView,发送了cancel事件给子视图处理了,自己当然滚动不了了。

二、重点理解
scroll view 原理是在滚动过程当中,其实是在修改原点坐标.当手指触摸后, scroll view会暂时拦截触摸事件,使用一个计时器,假如在计时器到点后,没有发生手指移动事件,那么,scroll view发送tracking events到被点击的subview假如在计时器到点前,发生了移动事件,那么 scroll view 取消tracking,自己发生滚动

scroll view还处理缩放和平移手势
要实现缩放和平移,必须实现委托viewForZoomingInScrollView:
scrollViewDidEndZooming:withView:atScale:
 两个方法,另外 maximumZoomScale和minimumZoomScale两个属性要不一样

(1)管理内容的显示
- setContentOffset:animated:设置与接受者原点相符的内容视图原点的偏移量

contentOffset默认CGPointZero,用来设置scrollView的滚动偏移量。
contentSize默认CGSizeZero,用来设置scrollView的滚动范围。

contentInset默认 UIEdgeInsetsZero,用来设置scrollView的额外滚动区域。

(2)管理滚动

scrollEnabled默认为YES,用来设置scrollView是否允许滚动.

directionlLockEnabled决定是否禁止某个方向滚动的bool值

scrollsToTop决定是否可以滚动到顶端的手势是否可用的bool值

-scrollRectToVisible:animated:滚动到内容视图的特定区域,以便显示

pagingEnabled默认为NO,用来设置scrollView是否开启分页.

bounces默认为YES,用来设置scrollView的弹簧效果,一个布尔值控制滚动视图是否能越过边缘的内容并且再次返回。

alwaysBounceVertical一个bool值,决定滑倒内容的末尾时是否返回
alwaysBounceHorizontal类似

touchesShouldBegin:withEvent:inContentView:被子类重载用来设置手指touch down在显示的内容上的默认行为

-touchesShouldCancelInContentView:是否取消与内容子视图有关的touches并且开始拖拽

canCancelContentTouches一个bool值决定是否在内容视图上的touches总是追踪

delaysContentTouches 控制视图是否延时调用开始滚动的方法

BOOL tracking 监控当前目标是否正在被跟踪

BOOL dragging 监控当前目标是否正在被拖拽

BOOL decelerating 监控当前目标是否正在减速

decelerationRate用户手指离开后,滚动减速的速率

(3)管理滚动指示器

BOOL showsHorizontalScrollIndicator 控制是否显示水平方向的滚动条
BOOL showsVerticalScrollIndicator 控制是否显示垂直方向的滚动条
UIEdgeInsets scrollIndicatorInsets 指定滚动条在scrollerView中的位置
UIScrollViewIndicatorStyle indicatorStyle 设定滚动条的样式
flashScrollIndicators瞬时显示指示器

(4)缩放及平铺


BOOL zoomBouncing 判断是否正在进行缩放反弹
zoomToRect:animated:放大到内容的特定区域以便显示
setZoomScale:animated:设置当前的缩放比例

(5)delegate
默认1.0,用来设置scrollView最少缩小比例
代理方法:
5.1当scrollView的偏移量一改变就会调用这个方法,即滚动scrollView就会调用。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
- 
5.2 当scrollView缩放时,就会调用这个方法
(void)scrollViewDidZoom:(UIScrollView *)scrollView NS_AVAILABLE_IOS(3_2);

5.3scrollView即将开始缩放
- (void)scrollViewWillBeginZooming:(UIScrollView )scrollView withView:(UIView )view

5.4 scrollView完成缩放
- (void)scrollViewDidEndZooming:(UIScrollView )scrollView withView:(UIView )view atScale:(float)scale;


5.5 即将拖拽的时候调用.
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;

5.6 即将停止拖拽的时候调用
- (void)scrollViewWillEndDragging:(UIScrollView )scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint )targetContentOffset NS_AVAILABLE_IOS(5_0);

5.7停止拖拽的时候调用。
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:
5.8减速开始时调用
- - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView

5.9 减速完成的时候调用
(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 

5.10 返回需要缩放哪个视图,这个视图必须是scrollView里的子视图。才能实现缩放
- (UIView )viewForZoomingInScrollView:(UIScrollView )scrollView;


// 列如:

- (UIView )viewForZoomingInScrollView:(UIScrollView )scrollView
{


 return scrollView.subviews[0];


 }




(6)管理键盘
keyboardDismissMode 在滚动视图上开始拖拽时,键盘消失的模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员的修养

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值