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

转载 2016年06月01日 10:57:44

概括:总的来说,就是你需要重写你的滚动视图 或者UITableViewCell类,实例代码在文章末尾。


        场景:一个按钮放在UIScrollView里 或者 UITableViewCell里时,点击按钮 发现按钮的高亮状态延时,如果迅速的触摸一下按钮 甚至不回看到按钮的高亮状态。

        原因:UIScrollView:

1、属性delaysContentTouches,布尔类型,默认值为YES。值为YES时,UIScrollView会在接收到手势时延迟150ms来判断该手势是否能够出发UIScrollView的滑动事件;值为NO时,UIScrollView会立马将接收到的手势分发到子视图上。
(注:仅仅设置这个是不够的,你会发现如果想要拖动scrollView而起点落在其他有手势识别的视图上时会拖不动)
2、方法- (BOOL)touchesShouldCancelInContentView:(UIView *)view,此方法的重载是帮助我们完美解决问题的重点,决定手势是否取消传递到view上,拖动ScrollView时触发。返回NO时,拖动手势将留在ScrollView上,返回YES则将手势传到view上。(若view是UIControl,则默认返回YES)


UITableView:
不得不说,UITableView(包括UITableViewCell在内)在iOS7和iOS8中的视图结构是不同的,且存在着很多我们在编码时永远接触不到的视图,但我们可通过Debug将其subviews逐个逐个找出来。这关系到我们这个问题坑比较深的层次。
iOS7:UITableView中存在n+1个UIScrollView,一个是UITableView本身,另外n个存在于UITableViewCell与cell的contentView之间,类名为UITableViewCellScrollView,活的不久,仅存在于iOS7中,在iOS8中已被移除。
iOS8:UITableView中存在2个UIScrollView,一个是UITableView本身,另外一个存在于UITableView与UITableViewCell之间,类名为UITableViewWrapperView。需要注意的是,UITableViewWrapperView在iOS7中并不是一个UIScrollView。


解决办法:

1、将UIButton所有属于UIScrollView的父视图的delaysContentTouches属性设置成为NO。
      2、继承UIScrollView或UITableView,并重写- (BOOL)touchesShouldCancelInContentView:(UIView*)view方法,让其响应拖动方法。


demoCodes:

自定义一个UIScrollView

- (instancetype)initWithFrame:(CGRect)frame

{

    if (self = [superinitWithFrame:frame])

    {

        self.delaysContentTouches =NO;//禁止滑动延时

        

    }

    returnself;

    

}


//重载

- (BOOL)touchesShouldCancelInContentView:(UIView *)view

{

    if ([viewisKindOfClass:[UIButtonclass]])

    {

        returnYES;

    }

    return [supertouchesShouldCancelInContentView:view];

    

}

UITableViewCell 的实例代码也是一样的。


文章参考自:http://blog.csdn.net/hyugahinat/article/details/46291813

使用SQLite.Swift实现SQLite3.0的读写

开发环境: Swift2.3 , IOS8.0+ ,XCode8.2 导入SQLite.swiftsource 'https://github.com/CocoaPods/Specs.git' pl...
  • sbt0198
  • sbt0198
  • 2016年12月31日 21:15
  • 1898

iOS开发之解决CocoaPods中“.h”头文件找不到的问题,简单粗暴的方法

如果是拖进工程中的framework或者第三方文件,如果找不到,删除了重新添加或者修改search path地址,如果不知道怎么修改,在工程文件夹中,找到对应的文件,然后将文件拖到修改文件地址的位置,...
  • hbblzjy
  • hbblzjy
  • 2017年06月23日 11:18
  • 1576

cocos2dx 3.2 解决触摸事件中两个按钮同时响应的问题

上篇触摸机制讲解中提到过存在两个按钮同时响应的问题。
  • wly_lly
  • wly_lly
  • 2014年12月29日 19:26
  • 1561

Android延时启动效果+轮播图+点击进入+沉浸式状态栏+按钮点击颜色渐变效果+好看的UI框架

最近发现Android产品要想拿得出手,除了稳定实用的功能,好看的UI必不可少。 废话不都说,为大家介绍几种常见的Android显示效果。 首先是延时启动效果,主要表现就是点击进去之后...

通过按钮跳过SplashActivity(启动画面),延时自动跳过SplashActivity进入MainActivity

方法1:通过顶栈名称进行判断,是够通过Handler进入MainActivity,避免重复进入MainActivity。 共有2个Activity:SplashActivity和MainActivit...

让UIScrollView上的subView响应触摸事件

UIScrollView本身是无法处理touch事件的。所以要想让UIScrollView上的子view响应Touch事件有俩个思路:第一, 就是重写这个子View类。 例如我要让UIScrollV...

UIScrollView 响应触摸事件的机制

原文链接:http://www.cocoachina.com/bbs/read.php?tid-40965-page-1.html 在滚动过程当中,其实是在修改原点坐标 当手指触摸后,...

Android 实现按钮在没有触摸事件时几秒钟之后自动隐藏

实现按钮在没有触摸事件时几秒钟之后自动隐藏  大概意思就是用一个线程来控制时间。  下面我实现一个Button的自动隐藏    获取控件         mButton = (Button)...

javascript实现html延时按钮

在上一篇文章中我发表了如何在每次按下时切换按钮,但是有的时候,我们需要按钮延时切换。比如下图例子,页面上有“校准”按钮,但是按下按键后,下位机设备需要一点时间才能完成校准的命令,这时如果按钮不作出相应...

关于iOS延时操作,阶段性总结(部分关于点击,双击事件冲突)

之前写过一个简单的图片查看器,在图片单击,双击事件处理上遇到问题,通过延时单击事件操作。 方法一: 详细:1.设置全局变量 bool doubleTap;在单击事件方法中设置延时操作 单击时进...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决 按钮响应延时[UIScrollView 和 UITableViewCell 中的子视图触摸事件延时]
举报原因:
原因补充:

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