捉襟见肘之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 ...
随机推荐
- ASP.NET 系列:单元测试之SmtpClient
使用SmtpClient发送Email时,我们可以创建ISmtpClient接口和SmtpClientWrapper适配类,在单元测试中对ISmtpClient进行Mock或自定义FackeSmtpC ...
- 半平面交模板(BZOJ1007)
#include<cstdio> #include<algorithm> #define LDB long double using namespace std; ]; str ...
- spring配置属性的两种方式
spring配置属性有两种方式,第一种方式通过context命名空间中的property-placeholder标签 <context:property-placeholder location ...
- 理解CDN
一.CDN定义 CDN的全称是Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定.通过 ...
- 网站移植到linux上后常犯的错误
常犯的错误 1:gcc库没装或者没装全 表现:没有可用的C编译器 同类错误:提示g++ not found, 解决:出现以上错误,则是因为gcc编译器没装,或者是没装全. 挂载光盘,到Pakeges里 ...
- extJs学习基础5 理解mvvm的一个小案例
今天很是幸运,看到了一位大神的博客,学习了不少的东西.太感谢了.(满满的都是爱啊) 建议去学习这个大神的博客,真心不错. 博客地址:http://blog.csdn.net/column/detail ...
- 解决Eclipse项目图标上的红色感叹号,红叉
从外部导入了几个jar包发现工程上出现红叉,但展开又没有详细的指明任何错误,可能过如下几步: 1.检查Build Path中的各个依赖jar及library是否有warning的标志,若有,处理之: ...
- 【CodeVS 1199】【NOIP 2012】开车旅行
http://codevs.cn/problem/1199/ 主要思想是倍增,对于第一个回答从后往前扫,依次插入平衡树中. 我写的splay,比较繁琐. #include<cmath> # ...
- jquery- pagination使用
$("#gupiaopage").page({ showInfo: false, showJump: false, showPageSizes: true, firstBtnTex ...
- 使用HTML来生产Android界面
使用HTML来生产Android界面 (2013-03-11 17:50:39) 转载▼ 分类: Android 1. HTML 开发软件界面 因为android软件开发分工目前还没有细化,程 ...