解决 按钮响应延时[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

UITableView那些坑

iOS prior to 6.0(included) is not considered. A respondsToSelector check might be needed in term of ...
  • lgouc
  • lgouc
  • 2015年04月07日 17:33
  • 5777

UITableViewCell点击事件无法响应问题

一次手贱,浪费时间一个小时。    UITableView的didSelectRowAtIndexPath在点击cell的时候没有触发,无论怎样调试就是不行,后来查看tableview的属性,发现Se...
  • zhangdalang
  • zhangdalang
  • 2016年07月15日 10:38
  • 691

UITableViewCell点击两次才响应的原因

原因是因为错用成了这个函数 [cpp] view plaincopy - (void)tableView:didDeselectRowAtIndex...
  • book_1992
  • book_1992
  • 2015年04月01日 13:42
  • 1263

UIbutton在UIScrollview中highlighted延迟

IOS开发之 ---- UIButton on the UIScrollView highlighted delay   转载▼ 最近做项目遇见一个问题:UIScrollVi...
  • csgcsg123
  • csgcsg123
  • 2015年09月09日 16:39
  • 436

如何解决UIScrollView把UITableViewCell的点击事件屏蔽

公司在做一个地图的项目。在线路预览时,有个需求是,路线预览时,每个卡片可以横向滚动,当卡片的内容超过一定高度后,该卡片的内容就要上下滚动,果断使用UIScrollView,但添加ScrollView后...
  • u012129719
  • u012129719
  • 2017年09月26日 12:13
  • 114

让UIScrollView的子view响应触摸事件

有时候在UIScrollView中有某些子视图需要响应一些触摸事件,比如拖动、画板等 但是默认情况下,触摸事件会被UIScrollView捕获 实际上解决的方法很多,这里我先列出一种(自认为最简单...
  • u013660421
  • u013660421
  • 2014年04月14日 10:56
  • 695

IOS UI学习 ScrollView中Touch事件作用子视图

IOS UI学习 ScrollView中Touch事件作用子视图是本文要介绍对内容,我们知道当多个视图进行叠加的时候,touch事件是作用到最上面的视图上,但是如果父视图是UIScrollView,如...
  • fangjjj
  • fangjjj
  • 2014年06月20日 21:27
  • 1511

相频响应与群延迟 .

虽然相频响应反映了系统对不同频率信号的处理时间,但并不是说相频响应越大,系统的处理时间越长。从一个简单的正弦信号exp(j*w*n)可以知道,其相位为w*t,也即是说相位不仅和时间有关,还和频率有关。...
  • dxshappy
  • dxshappy
  • 2012年10月14日 11:51
  • 7654

UIButton 点击事件响应延迟 问题解决

UIButton 点击事件响应延迟 问题解决 问题表现 我在UITableView的Header上添加了一个视图(FiltersView),FiltersView上面添加了不定数量的 UIButt...
  • zzsatym
  • zzsatym
  • 2016年07月07日 11:25
  • 2384

javascript实现html延时按钮

在上一篇文章中我发表了如何在每次按下时切换按钮,但是有的时候,我们需要按钮延时切换。比如下图例子,页面上有“校准”按钮,但是按下按键后,下位机设备需要一点时间才能完成校准的命令,这时如果按钮不作出相应...
  • sherry_qin
  • sherry_qin
  • 2016年03月15日 15:58
  • 1649
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决 按钮响应延时[UIScrollView 和 UITableViewCell 中的子视图触摸事件延时]
举报原因:
原因补充:

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