热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

xcodescrollView

scrollView的属性有很多,我当初在研究scrollView的时候被它的contentOffset,contentInset等属性弄得纠结万分&#

scrollView的属性有很多,我当初在研究scrollView的时候被它的contentOffset,contentInset等属性弄得纠结万分,昨天要写一个下拉刷新的demo,contentOffset等阴暗的嘴脸又浮现在我的眼前,加上前一阵子项目紧,好久没写博客了,今天就挑个时间把这几个东东给扒一扒,加深下印象的同时给广大同胞一些别的思路,便于深入理解;

scrollView不用多说了,可滚动视图,可以在有限的屏幕空间上显示大于屏幕尺寸的内容,端得是方便无比;举个我个人觉得比较恰当的例子,就像两张重叠在一起的纸,上面的纸中间有个320*480的屏幕状的洞,然后下面的纸可以无限大,显示是内容,你可以将手指通过这张洞来移动下面的纸,来阅读上面的信息,所以,懂了吧。。现在来介绍一下scrollView三个基本的要理解的属性;

contentSize

苹果官方文档的解释是:The size of the content view.所以很好理解,contentSize也就是scrollView可滚动的区域;

contentOffset

苹果官方文档的解释是:The point at which the origin of the content view is offset from the origin of the scroll view.注意,这里标注的是point,是当前显示的区域的origin相对于整个scrollView的origin的位置;

contentInset

苹果官方文档的解释是:The distance that the content view is inset from the enclosing scroll view.注意,这里说得是distance,四个值分别是上下左右,就像上面那个例子,屏幕状的洞和下面的纸的边缘之间是有距离的;默认值是 UIEdgeInsetsZero,也就是四个值都为0,我在stackOverFlow上发现了一个很形象的最佳答案,粘贴如下:


It sets the distance of the inset between the content view and the enclosing scroll view.aScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 7.0);

Here's a good iOS Reference Library article on scroll views that has an informative screenshot (fig 1-3) - I'll replicate it via text here:

_|←_cW_→_|_↓_
| |
---------------
|content| ↑
↑ |content| contentInset.top
cH |content|
↓ |content| contentInset.bottom
|content| ↓
---------------
_|_______|___

(cH = contentSize.height; cW = contentSize.width)

The scroll view encloses the content view plus whatever padding is provided by the specified content insets.

scrollView中还有好多别的属性,比如tracking,zooming,decelerating等,什么 touch 后还没拖动的时候,滚动后手放开的时候,是否要自动滚到subView的边界处等等,网上有很好的总结说明,官方library里也介绍得很详细很形象,这里就不多说了,上面介绍的这三个属性很基本很重要,如果要加深理解,可以看我附件中的代码,下拉刷新的,参照网上一个朋友的源码自己实现了一下,果然很好用;另外,scrollView也经常用在登陆界面中,一般是弹出键盘时候,输入框的向上平移,所以,反正很重要;对了,下拉刷新一般都是和tableView一块儿实现,tableView也是scrollView;

 


ios scroll view 原理(转)  

2011-11-01 17:09:31|  分类:iphone 笔记 |  标签:|字号 订阅




scroll view 原理 在滚动过程当中,其实是在修改原点坐标。当手指触摸后, scroll view会暂时拦截触摸事件,使用一个计时器。假如在计时器到点后没有发生手指移动事件,那么 scroll view 发送

scroll view 原理

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

    子类可以重载

touchesShouldBegin:withEvent:inContentView: 决定自己是否接收 touch 事件
pagingEnabled:当值是 YES 会自动滚动到 subview 的边界,默认是NO
touchesShouldCancelInContentView: 开始发送 tracking messages 消息给 subview 的时候调用这个方法,决定是否发送 tracking messages 消息到subview。假如返回 NO,发送。YES 则不发送。
假如 canCancelContentTouches属性是NO,则不调用这个方法来影响如何处理滚动手势。

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

几个属性介绍

tracking
当 touch 后还没有拖动的时候值是YES,否则NO

zoomBouncing
当内容放大到最大或者最小的时候值是 YES,否则 NO

zooming
当正在缩放的时候值是 YES,否则 NO

decelerating
当滚动后,手指放开但是还在继续滚动中。这个时候是 YES,其它时候是 NO

decelerationRate
设置手指放开后的减速率

maximumZoomScale
一个浮点数,表示能放最大的倍数

minimumZoomScale 
一个浮点数,表示能缩最小的倍数

pagingEnabled
当值是 YES 会自动滚动到 subview 的边界。默认是NO

scrollEnabled
决定是否可以滚动

delaysContentTouches
是个布尔值,当值是 YES 的时候,用户触碰开始,scroll view要延迟一会,看看是否用户有意图滚动。假如滚动了,那么捕捉 touch-down 事件,否则就不捕捉。假如值是NO,当用户触碰, scroll view 会立即触发 touchesShouldBegin:withEvent:inContentView:,默认是 YES

canCancelContentTouches
当值是 YES 的时候,用户触碰后,然后在一定时间内没有移动,scrollView 发送 tracking events,然后用户移动手指足够长度触发滚动事件,这个时候,scrollView 发送了 touchesCancelled:withEvent: 到 subview,然后 scroView 开始滚动。假如值是 NO,scrollView 发送 tracking events 后,就算用户移动手指,scrollView 也不会滚动。

contentSize
里面内容的大小,也就是可以滚动的大小,默认是0,没有滚动效果。

showsHorizontalScrollIndicator
滚动时是否显示水平滚动条

showsVerticalScrollIndicator
滚动时是否显示垂直滚动条

bounces
默认是 yes,就是滚动超过边界会反弹有反弹回来的效果。假如是 NO,那么滚动到达边界会立刻停止。

bouncesZoom
和 bounces 类似,区别在于:这个效果反映在缩放上面,假如缩放超过最大缩放,那么会反弹效果;假如是 NO,则到达最大或者最小的时候立即停止。

directionalLockEnabled
默认是 NO,可以在垂直和水平方向同时运动。当值是 YES 时,假如一开始是垂直或者是水平运动,那么接下来会锁定另外一个方向的滚动。 假如一开始是对角方向滚动,则不会禁止某个方向

indicatorStyle
滚动条的样式,基本只是设置颜色。总共3个颜色:默认、黑、白

scrollIndicatorInsets
设置滚动条的位置

scrollview里面的view拖动的问题

请教一下各位一个问题:
我现在在一个scrollview上排列了很多view,这个scrollview是可以滚动的,我还想拖动view,但 是问题出现了,如果scrollview只能垂直滚动的话,横向拖动view是没问题的,但是竖向拖动view就会导致scrollview滚动,而本意 要移动的view却不动了.
scrollview不响应用户触摸的话,它自己就不能拖动了吧?我的目的是它也能动,但是其他view动的时候他不能动

解决了,在touchbegain中禁止scrollview滚动,然后在touchend中开启scrollview滚动

 

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view;  
......

今天实验了一次,scrollview默认就是这么实现的,所以我不用自己重写这个方法,
scrollview的工作原理是:当手指触摸后, scroll view会暂时拦截触摸事件,使用一个 计时器,假如在计时器到点后,没有发生手指移动事件, 那么,scroll view发送tracking events到被点击的subview, 假如在计时器到点前,发生了移动事件,那么 scroll view 取消tracking 自己发生滚动. 
我最后的解决办法很无语,在touchbegain中,禁止scrollview的滚动,在touchend中打开scrollview的滚动

我的源代码涉及到的东西比较多,不好剥离出来,我给你大概描述一下吧


//--------------初始化各个view--------------
UIScrollView *_scrollview = [[UIScrollView alloc] init];

//自定义的view,放到scrollview上
//其实正常的view就可以加到scrollview上,我之所以要自定义这么一个中间view,是因为我要重写touch的所有方法
//重写touch方法的原因是,我要在touchBegain中让scrollview的滚动失效,而在touchEnd中让滚动有效
UIMyView *_myView=[[UIMyView alloc] init];

//需要拖动的view
UIView *_view = [[UIView alloc] init];



[_myView addSubview:_view];//将view加入自定义的view中,


[_scrollview addSubview:_myView];//将自定义view加入scrollview中
//-----------------------------------------------------


//-----------MyView中的方法,其他部分我就不写了,只关注touch方法-------------------


....

#pragma mark --
#pragma mark touch
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
.....你自己的代码......


UITouch *touch = [touches anyObject];

//如果是主view,则不进行操作
if ([touch view]==self) {
  return;
}


//由于中间隔了一层自定义的view,所以要两次superview
UIScrollView *_scrollview = (UIScrollView *)[[[touch view] superview] superview];
_scrollview.scrollEnabled=NO;//让scrollview停止响应滚动


.....你自己的代码......
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
.....你自己的代码...... 

UITouch *touch = [touches anyObject];

UIScrollView *_scrollview = (UIScrollView *)[[[touch view] superview] superview];
_scrollview.scrollEnabled=YES;//让scrollview可以响应滚动


.....你自己的代码...... 
}


 

UIScrollView 类负责所有基于 UIKit 的滚动操作。

一、创建


源码copy to clipboard打印?
  1. CGRect bounds = [ [ UIScreen mainScreen ] applicationFrame ] ;   
  2. UIScrollView* scrollView = [ [UIScrollView alloc ] initWithFrame:bounds ];  

CGRect bounds = [ [ UIScreen mainScreen ] applicationFrame ] ;
UIScrollView* scrollView = [ [UIScrollView alloc ] initWithFrame:bounds ];

当你创建完滚动视图后,你可以将另一个视图的内容粘合到滚动视图的空白页上。这回创建一个滚动的内容窗口:


源码copy to clipboard打印?
  1. [ scrollView addSubview:myView];   

[ scrollView addSubview:myView];

你必须给出内容的实际大小,这样滚动视图才知道滚动的范围:


源码copy to clipboard打印?
  1. scrollView.contentSize = myView.frame.size;  

scrollView.contentSize = myView.frame.size;

要开启缩放功能需要调整视图的两个属性,分别是maxinumZoomScale 和 mininumZoomScale 。这样就可以允许用户使用捏合手势调整内容大小:


源码copy to clipboard打印?
  1. scrollView.maxinumZoomScale = 2.0;//允许放大2倍   
  2. scrollView.mininumZoomScale = 0.5;//允许放大到0.5倍  

scrollView.maxinumZoomScale = 2.0;//允许放大2倍
scrollView.mininumZoomScale = 0.5;//允许放大到0.5倍

要打开缩放功能,你还需要增加一个UIScrollViewDelegate 代理,通过一个名为 viewForZoomingScrollView

的方法做出响应。这个方法会返回进行缩放时所使用的 UIView 对象:


源码copy to clipboard打印?
  1. scrollView.delegate = self;   
  2. - (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView{   
  3. "WHITE-SPACE: pre"> retutn myView;   
  4. }  

scrollView.delegate = self;
- (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView{
retutn myView;
}

Tips:对于大规模数据,你可能会在最初使用一个低于实际大小(1.0)的缩放比例,让用户可以平滑地进行放大。

二、属性

除了上面用到的缩放属性外,滚动视图还有会让你多其他属性,可以对现实内容的行为进行微调。你可以对 UIScrollView 类进行多方位定制。下面这些属性是最常用的。

1.indicatorStyle

指定你希望使用的滚动条指示器的类型。默认行为是在白边界上绘制黑色的滚动条,这在大多数背景下都适用。可用风格如下:


源码copy to clipboard打印?
  1. UIScrollViewIndicatorStyleDefault   
  2. UIScrollViewIndicatorStyleBlack   
  3. UIScrollViewIndicatorStyleWhite  

UIScrollViewIndicatorStyleDefault
UIScrollViewIndicatorStyleBlack
UIScrollViewIndicatorStyleWhite

2.contentOffset

一个CGPoint结构,其中包含有要显示内容相对于窗口左上角的偏移量。默认是从0×0开始的,但是你也可以将显示内容放在其他位置。

3.directionalLockEnabled

默认行为是允许用户同时进行横向和纵向的滚动。将这个属性设置为YES会导致将用户的滚动行为锁定成只允许横向或纵向进行,具体方向由初始姿态决定。

4.bounces

当用户抵达滚动区域边缘时,这个功能允许用户稍微拖动到边界外一点。当用户松开手指后,这个区域会像个橡皮筋一样,弹回到原位,给用户一个可见的提示,表示他已经到达了文档开始或结束位置。如果不想让用户的滚动范围能够超出可见内容,可以将这个属性设置为NO。

5.bouncesZoom

类似于bounces 选项,这个方法可以令用户的缩放操作超出最大或最小缩放级别,然后弹回到范围以内。如果你不想让用户能够超出你指定的范围进行缩放,将这个属性设置为NO。

6.pagingEnabled

当开启了分页功能时,滚动视图被分割成多个独立区段,二用户的滚动体验则变成了页面翻转,你可以用这个属性来进行页面翻转。

三、委托方法

可以赋予滚动视图一个委托,下列委托方法会在特定时刻收到通知。


源码copy to clipboard打印?
  1. -(void)scrollViewDidScroll:(UIScrollView*)scrollView;//会在视图滚动时收到通知。包括一个指向被滚动视图的指针,从中可以读取contentOffset属性以确定其滚动到的位置。  

-(void)scrollViewDidScroll:(UIScrollView*)scrollView;//会在视图滚动时收到通知。包括一个指向被滚动视图的指针,从中可以读取contentOffset属性以确定其滚动到的位置。

 


源码copy to clipboard打印?
  1. -(void)scrollViewWillBeginDragging:(UISCrollView*)scrollView;//当用户首次在某个方向上进行拖动时得到通知。这个方法会得到被作为参数传递的滚动视图指针,也同样可以从中读取 contentOffset 属性。  

-(void)scrollViewWillBeginDragging:(UISCrollView*)scrollView;//当用户首次在某个方向上进行拖动时得到通知。这个方法会得到被作为参数传递的滚动视图指针,也同样可以从中读取 contentOffset 属性。

源码copy to clipboard打印?
  1. -(void)scrollViewDidEndDragging:(UIScrollView*)scrollView willDecelerate:(BOOL)decelerate;   
  2. //当用户抬起拖动到手指时得到通知。还会得到一个布尔值,知名报告滚动视图最后位置之前,是否需要减速。  

-(void)scrollViewDidEndDragging:(UIScrollView*)scrollView willDecelerate:(BOOL)decelerate;
//当用户抬起拖动到手指时得到通知。还会得到一个布尔值,知名报告滚动视图最后位置之前,是否需要减速。

源码copy to clipboard打印?
  1. -(void)scrollViewWillBeginDecelerate:(UIScrollView*)scrollView;//当用户抬起手指而视图需要继续移动时,会收到通知。这个方法可以用来读取 contentOffset属性,从而判断出当用户抬起手指钱最后一次滚动到的位置,虽然这个位置并不会使滚动条的最终停止位置。  

-(void)scrollViewWillBeginDecelerate:(UIScrollView*)scrollView;//当用户抬起手指而视图需要继续移动时,会收到通知。这个方法可以用来读取 contentOffset属性,从而判断出当用户抬起手指钱最后一次滚动到的位置,虽然这个位置并不会使滚动条的最终停止位置。

源码copy to clipboard打印?
  1. -(void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView;//当上面提到的减速完毕、滚动视图停止时得到通知。收到这个通知的时刻,滚动视图的contentOffset属性会反映出滚动条最终停止的位置。  

-(void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView;//当上面提到的减速完毕、滚动视图停止时得到通知。收到这个通知的时刻,滚动视图的contentOffset属性会反映出滚动条最终停止的位置。

源码copy to clipboard打印?
  1. -(void)scrollViewDidEndZooming:(UIScrollview*)scrollView withView:(UIView*)view atScale:(float)scale;//当用户对内容进行缩放时,会收到通知。缩放比例表示为一个浮点值,会作为参数传递进来。  

-(void)scrollViewDidEndZooming:(UIScrollview*)scrollView withView:(UIView*)view atScale:(float)scale;//当用户对内容进行缩放时,会收到通知。缩放比例表示为一个浮点值,会作为参数传递进来。

源码copy to clipboard打印?
  1. -(BOOL)scrollViewShouldScrollToTop:(UIScrollView*)scrollView;   
  2. -(void)scrollViewDidScrollToTop:(UIScrollView*)scrollView;   
  3. //当用户点出iPhone状态条时,滚动视图委托可以决定视图是否滚动回到开头。  

-(BOOL)scrollViewShouldScrollToTop:(UIScrollView*)scrollView;
-(void)scrollViewDidScrollToTop:(UIScrollView*)scrollView;
//当用户点出iPhone状态条时,滚动视图委托可以决定视图是否滚动回到开头。

OK,都总结完了,后面会写一个页面翻转的例子敬请关注。


 

 


推荐阅读
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 本文介绍了CSS样式属性text-overflow、overflow、white-space、width的使用方法和效果。通过设置这些属性,可以实现文本溢出省略号、隐藏溢出内容、禁止换行以及限制元素宽度等效果。详细讲解了每个属性的作用和用法,以及常见的应用场景和注意事项。对于前端开发者来说,掌握这些CSS样式属性的使用方法,能够更好地实现页面布局和文本显示效果。 ... [详细]
  • 本文整理了Java中org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc.getTypeInfo()方法的一些代码示例,展 ... [详细]
author-avatar
手机用户2502905147
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有