细说UIScrollView上的Touch 事件

转载 2016年05月31日 16:18:05

原文地址:http://285746555.blog.51cto.com/2966432/658383

1 开篇

最近在项目中遇到一个 需求就是在一个可以左右拨动的页面上,添加一些交互功能,比如说点击某个页面会有文字变化,图片变换,最后有比较特殊的需求是做个像slider功能的可以拖动的按钮,并且有吸附功能,即当滑动停止在两个图标间的时候,可以滑向离自己比较近的图标。

(PS:本人是新手,哈哈,高手就全当路过吧),一看到的时候觉的没什么问题,很简单的不就是一个scrollview+touch 事件就能搞定么,可是做着就出问题了。

2 问题

发现放在scrollview上的view 都不能响应touch 事件,想了好久不得其解,应该没什么东西覆盖在view 上,怎么点击就是没反应呢?网上转了一圈,真实收获不少,特别是一篇UIScrollerView 原理详解,更使我恍然大悟,书到用时方恨少啊 。

3 UIScrollerView 原理

其实这个原理道理网上已经讲的很明白,我就引用下上面那位高手的原文吧:

UIScrollView的工作原理,当手指touch的时候,UIScrollView会拦截Event,会等待一段时间,在这段时间内,如果没有手指 没有移动,当时间结束时,UIScrollView会发送tracking events到子视图上。在时间结束前,手指发生了移动,那么UIScrollView就会进行移动,从而取笑发送tracking。

自己也总结了下,没上面的这位易于理解。所以就直接引用了,多看几遍发现还真是这么回事。

4 问题的解决思路

一般是两个思路,一个是通过定制一个scrollerview,并重写他的touch 方法。

  1. - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event{
  2. if(!self.dragging)
  3. {
  4. [[selfnextResponder]touchesBegan:toucheswithEvent:event];
  5. }
  6. [supertouchesBegan:toucheswithEvent:event];
  7. //NSLog(@"MyScrollView touch Began");
  8. }
  9. - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
  10. {
  11. if(!self.dragging)
  12. {
  13. [[selfnextResponder]touchesEnded:toucheswithEvent:event];
  14. }
  15. [supertouchesEnded:toucheswithEvent:event];
  16. }

第二个是通过响应链将事件传递给下一个响应者去实现,即将俯视图的事件传递给子视图去处理

目前大致就这两个方法来处理

5一些准备

下面这个函数的功能是判断是否可以把touch 事件传递给子视图,即在他上面的视图。当返回是yes 的时候就表示可以,就当点击子视图view 的时候停止响应scroll事件,改而响应子视图的touch 事件,当为no 时则拒绝子视图响应,执行父视图的touch 事件,下面的代码时实现了当子视图时按钮的时候就响应其对应的功能,子很多时候还是很管用的。

  1. //父视图是否可以将消息传递给子视图,yes是将事件传递给子视图,则不滚动,no是不传递则继续滚动
  2. - (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view
  3. {
  4. if ([view isKindOfClass:[UIButton class]])
  5. {
  6. return YES;
  7. }
  8. else
  9. {
  10. return NO;
  11. }
  12. }

     setDelaysContentTouches  这个函数主要时判断是否延迟执行tracking 一般情况下是yes  即会延迟执行,就是先等待一会儿看scrollview 是否有touch 事件发生,如果没有则转而执行子视图的 的touch 事件。
  1. //yes 则发送一个可以touchesCancelled:withEvent: 然后把这个事件当作一次滚动赖实现
  2. [baseScrollView setCanCancelContentTouches:YES];
  3. //滚动的时候是否可以除边界,即到边界的时候是否可以多看到一点内容
  4. [baseScrollView setBounces:NO];
  5. // 当值是NO 立即调用 touchesShouldBegin:withEvent:inContentView 看是否滚动 scroll
  6. [baseScrollView setDelaysContentTouches:NO];

相关文章推荐

细说UIScrollView上的Touch 事件

1 开篇 最近在项目中遇到一个 需求就是在一个可以左右拨动的页面上,添加一些交互功能,比如说点击某个页面会有文字变化,图片变换,最后有比较特殊的需求是做个像slider功能的可以拖动的按钮,...

ios UIScrollView响应touch事件

  • 2012年10月17日 15:14
  • 33KB
  • 下载

『IOS』UIScrollView无法响应touch事件的解决办法

原文地址:http://blog.csdn.net/smking/article/details/8073747 下面这个方法使用的地方很多, 比如在一个UITextView中要加上...

UIScrollView的作用原理,实现scrollView中touch事件作用子视图

我们知道当多个视图进行叠加的时候,touch事件是作用到最上面的视图上,但是如果父视图是UIScrollView,如果默认,可能touch子视图会造成UIScrollView的滚动。 UIS...

UIScrollView上的控件处理touch事件

http://blog.csdn.net/ztp800201/article/details/7973036 http://blog.sina.com.cn/s/blog_7daf0a5f0100t...
  • jeffasd
  • jeffasd
  • 2016年03月26日 09:36
  • 656

UIScrollView响应UITouc事件

  • 2014年04月29日 17:13
  • 3KB
  • 下载

解决 按钮响应延时[UIScrollView 和 UITableViewCell 中的子视图触摸事件延时]

概括:总的来说,就是你需要重写你的滚动视图 或者UITableViewCell类,实例代码在文章末尾。         场景:一个按钮放在UIScrollView里 或者 UITableViewC...

Android中Touch事件的传递

  • 2015年03月27日 23:56
  • 83KB
  • 下载

安卓touch事件的分发和消费机制

  • 2015年03月16日 01:23
  • 4.63MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:细说UIScrollView上的Touch 事件
举报原因:
原因补充:

(最多只允许输入30个字)