捉襟见肘之UIScrollView 【一】
参考地址:http://segmentfault.com/a/1190000002412930
另一个优秀的UIScrollView实践文章地址:http://tech.glowing.com/cn/practice-in-uiscrollview/
以上地址如果转载,在其作者的允许下,标清转载连接
引言:
UIScrollView是几个UIKit类包括UITableView和UITextView的超类(基类、父类)
一个UIScrollView对象(或者,简单地说,一个滚动视图)的核心概念是,它是一个视图,其起源是可调过的内容视图。它剪辑的内容,它的框架,这通常(但不一定)恰逢该应用程序的主窗口。滚动视图跟踪手指的变动,并相应调整原点。这正显示出它的内容“,通过”滚动视图的视图绘制的基础上,新的原点,它被固定在内容视图的偏移部分本身。滚动视图本身没有绘制,除了显示垂直和水平滚动的指标。滚动视图必须知道的内容视图的大小,所以它知道何时停止滚动,默认情况下,它“反弹”回来时,滚动超出了内容的范围。 用于管理内容的绘制有关的对象显示在一个滚动视图应该瓦片的内容的子视图,以便没有视图超过屏幕的大小。当用户在滚动滚动视图,这个对象应该添加和删除子视图是必要的。 由于滚动视图没有滚动条,它必须知道是否触摸信号的意图与滚动意图在内容跟踪一个子视图。做出此决定,它暂时拦截触摸按下事件通过启动一个定时器,并在定时器触发之前,看是否触摸手指做任何运动。如果定时器触发无位置显著的变化,滚动视图将跟踪事件的内容视图的感动子视图。然后,如果用户在定时器期满前拉着自己的手指远远不够,滚动视图将取消任何跟踪的子视图,并进行滚动本身。子类可以重写touchesShouldBegin : withEvent:方法inContentView :,pagingEnabled和touchesShouldCancelInContentView :方法(这是由滚动视图调用)来影响滚动视图如何处理滚动手势。
滚动视图还处理缩放和平移的内容。当用户使一个夹在或向外挤压手势,滚动视图调整偏移量和内容的标度。当手势结束,管理内容视图中的对象应该要更新的内容为必要的子视图。 (请注意,手势可以结束和手指仍可能下跌。 )虽然手势正在进行中,滚动视图不发送任何跟踪调用子视图。 该UIScrollView的类可以有必须采取UIScrollViewDelegate协议的委托。对于缩放和平移工作,委托必须实现viewForZoomingInScrollView :和scrollViewDidEndZooming : withView : atScale : ,此外,最大( maximumZoomScale )和最小( minimumZoomScale )变焦倍数必须是不同的。
方法&&属性:
// 监控目前滚动的位置(默认CGPointZero)
CGPoint contentOffset; - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;
// 滚动范围的大小(默认CGSizeZero)
CGSize contentSize;
// 视图在scrollView中的位置(UIEdgeInsetsZero)
UIEdgeInsets contentInset;
// 指定滚动条在scrollerView中的位置
UIEdgeInsets scrollIndicatorInsets;
// 设置协议
id<UIScrollViewDelegate> delegate;
// 指定控件是否只能在一个方向上滚动(默认为NO)
BOOL directionalLockEnabled;
// 控制控件遇到边框是否反弹(默认为YES)
BOOL bounces;
// 控制垂直方向遇到边框是否反弹(默认为NO,如果为YES,bounces也是YES)
BOOL alwaysBounceVertical;
// 控制水平方向遇到边框是否反弹(默认为NO,如果为YES,bounces也是YES)
BOOL alwaysBounceHorizontal;
// 控制控件是否整页翻动(默认为NO)
BOOL pagingEnabled;
// 控制控件是否能滚动
BOOL scrollEnabled;
// 控制是否显示水平方向的滚动条
BOOL showsHorizontalScrollIndicator;
// 控制是否显示垂直方向的滚动条
BOOL showsVerticalScrollIndicator;
// 设定滚动条的样式
UIScrollViewIndicatorStyle indicatorStyle;
UIScrollViewDelegate详解
//scrollView滚动时,就调用该方法。任何offset值改变都调用该方法。即滚动过程中,调用多次 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidScroll"); CGPoint point=scrollView.contentOffset; NSLog(@"%f,%f",point.x,point.y); // 从中可以读取contentOffset属性以确定其滚动到的位置。 // 注意:当ContentSize属性小于Frame时,将不会出发滚动 }
// 当scrollView缩放时,调用该方法。在缩放过程中,回多次调用 - (void)scrollViewDidZoom:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidScroll"); float value=scrollView.zoomScale; NSLog(@"%f",value); }
// 当开始滚动视图时,执行该方法。一次有效滑动(开始滑动,滑动一小段距离,只要手指不松开,只算一次滑动),只执行一次。 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ NSLog(@"scrollViewWillBeginDragging"); }
// 滑动scrollView,并且手指离开时执行。一次有效滑动,只执行一次。 // 当pagingEnabled属性为YES时,不调用,该方法 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{ NSLog(@"scrollViewWillEndDragging"); }
// 滑动视图,当手指离开屏幕那一霎那,调用该方法。一次有效滑动,只执行一次。 // decelerate,指代,当我们手指离开那一瞬后,视图是否还将继续向前滚动(一段距离),经过测试,decelerate=YES - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ NSLog(@"scrollViewDidEndDragging"); if (decelerate) { NSLog(@"decelerate"); }else{ NSLog(@"no decelerate"); } CGPoint point=scrollView.contentOffset; NSLog(@"%f,%f",point.x,point.y); }
// 滑动减速时调用该方法。 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{ NSLog(@"scrollViewWillBeginDecelerating"); // 该方法在scrollViewDidEndDragging方法之后。 }
// 滚动视图减速完成,滚动将停止时,调用该方法。一次有效滑动,只执行一次。 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidEndDecelerating"); [_scrollView setContentOffset:CGPointMake(, ) animated:YES]; }
// 当滚动视图动画完成后,调用该方法,如果没有动画,那么该方法将不被调用 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidEndScrollingAnimation"); // 有效的动画方法为: // - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated 方法 // - (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated 方法 }
// 一般用在图片的展示的时候,缩放观看的场合中:
// 返回将要缩放的UIView对象。要执行多次 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{ NSLog(@"viewForZoomingInScrollView"); return self.imgView; }
// 当将要开始缩放时,执行该方法。一次有效缩放,就只执行一次。 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view{ NSLog(@"scrollViewWillBeginZooming"); }
// 当缩放结束后,并且缩放大小回到minimumZoomScale与maximumZoomScale之间后(我们也许会超出缩放范围),调用该方法。 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{ NSLog(@"scrollViewDidEndZooming"); }
// 界面刷新的时候,或者类似于,返回火箭场景中
// 指示当用户点击状态栏后,滚动视图是否能够滚动到顶部。需要设置滚动视图的属性:_scrollView.scrollsToTop=YES; - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{ return YES; }
// 设置界面中,下拉框或者一些toolbar场景中
// 当滚动视图滚动到最顶端后,执行该方法 - (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidScrollToTop"); }
Tip:判断uiscrollview是向上滚动还是向下滚动
// 用来自定义toolbar收起和显示的功能
int _lastPosition; //A variable define in headfile - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ int currentPostion = scrollView.contentOffset.y; ) { _lastPosition = currentPostion; NSLog(@"ScrollUp now"); } ) { _lastPosition = currentPostion; NSLog(@"ScrollDown now"); } } // 25 可以是任意数字,可根据自己的需要来设定。
// 升级版:到达顶部或底部时不会反弹 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { int currentPostion = scrollView.contentOffset.y; && currentPostion > ) { //这个地方加上 currentPostion > 0 即可) _lastPosition = currentPostion; NSLog(@"ScrollUp now"); } ) && (currentPostion <= scrollView.contentSize.height-scrollView.bounds.size.height-) ){ _lastPosition = currentPostion; NSLog(@"ScrollDown now"); } }
捉襟见肘之UIScrollView 【一】的更多相关文章
- 【原】Masonry+UIScrollView的使用注意事项
[原]Masonry+UIScrollView的使用注意事项 本文转载请注明出处 —— polobymulberry-博客园 1.问题描述 我想实现的使用在一个UIScrollView依次添加三个UI ...
- UIScrollView的封装
UIScrollView的封装 效果 特点 1.用法简单,尺寸大小,随意设置位置 2.可以有多个数据源的数据,可以定制不通的界面(如同上图,一个有文字,一个没有文字) 3.能够实现点击事件 用法 1. ...
- UI第十七节——UIScrollView
// 实例化一个ScrollView UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:[[UIScreen main ...
- UI控件(UIScrollView)
@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //创建一个scrollview UIScrollV ...
- UIScrollView的delaysContentTouches与canCencelContentTouches属性
UIScrollView有一个BOOL类型的tracking属性,用来返回用户是否已经触及内容并打算开始滚动,我们从这个属性开始探究UIScrollView的工作原理: 当手指触摸到UIScrollV ...
- iOS 视图:重绘与UIScrollView(内容根据iOS编程编写)
我们继续之前的 Hypnosister 应用,当用户开始触摸的时候,圆形的颜色会改变. 首先,在 JXHypnosisView 头文件中声明一个属性,用来表示圆形的颜色. #import " ...
- 学习笔记之-------UIScrollView 基本用法 代理使用
//contentSize.contentInset和contentOffset 是 scrollView三个基本的属性. // 滚动 self.ScrollView.contentSize =sel ...
- iOS UIScrollView的使用
一.为什么要用UIScrollView? 移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容普通的UIVie ...
- iOS之UIScrollView循环滚动
#import "ViewController.h" #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width #d ...
随机推荐
- IL指令大全(转)
名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...
- 移动OA,致我们终将逝去的青春(程序员版)[转]
移动OA和致青春有什么关系,难道说赵薇也来做手机应用了?为什么不行,当年小燕子代言的打印机可是红火的很,现在再秀一把时尚手机办公也未必不可啊.言归正转,本文还是以点代面阐述移动OA开发过程,但是,它的 ...
- 使用axes函数在matlab绘图中实现图中图的绘制
使用axes函数在matlab绘图中实现图中图的绘制 有时为了对细节进行详细说明,需要在一个较大坐标轴上绘制一个小图来对局部进行放大以阐述结果. 这可以通过调用axes函数实现. 下面通过绘制 y=1 ...
- Spring3+Mybatis3+Mysql+ivy+liquibase
Spring3+Mybatis3+Mysql+ivy+liquibase 集成 近一周时间所学技术:整合Spring+MyBatis+MySql+ivy+liquibase Mybatis:是一个基于 ...
- mysql 安装失败解决方法
在安装mysql的过程中,出现的最麻烦的问题和解决方法 安装后,启动不成功,就卡了,程序就没有响应. 如何解决: 找到mysql安装目录下的 #Path to the database root da ...
- HttpModule与HttpHandler详解
ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,A ...
- java获取json格式中的值
先右键项目,然后点击properties,然后选中java Builder Path,选择add external jars,引入需要引入json.jar package web; import or ...
- BuiltWith
BuiltWith网站技术信息查询工具 利用该网站所提供的功能,你可以查询出某网站背后是由哪些技术来支持的, 比如操作系统的类型.所采用的访问量统计服务.采用的发布平台.广告平台.语言框架.聚合功能. ...
- 【unity shaders】:Unity中的Shader及其基本框架
shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...
- Hive 的 map join
学习自 http://blog.csdn.net/xqy1522/article/details/6699740 1. Map Join 的使用场景: 关联操作中有一张表非常小 不等值的链接操作 2. ...