在UITableView上添加按钮点击时高亮态延迟出现问题

问题描述:

在UITableView的cell或者headerView或者footer上添加按钮,点击时高亮态延时出现,也就是点击时候可以响应事件,但是按钮没有马上显示高亮态,高亮态只能是在长按之后才能显示出来,效果看下图:


有些童鞋可能在UIScrollView上添加按钮时候也遇到这一问题,我们都知道UITableView是继承于UIScrollView的,其实是这样的,这是苹果对UIScrollView的一个优化,UIScrollView有一个BOOL类型的tracking属性,用来返回用户是否已经触及内容并打算开始滚动,我们从这个属性开始探究UIScrollView的工作原理:

当手指触摸到UIScrollView内容的一瞬间,会产生下面的动作:

  • 拦截触摸事件
  • tracking属性变为YES

  • 一个内置的计时器开始生效(默认时间间隔是150ms),用来监控在极短的事件间隔内是否发生了手指移动

    case1:当检测到时间间隔内手指发生了移动,UIScrollView自己触发滚动,tracking属性变为NO,手指触摸下即使有(可以响应触摸事件的)内部控件也不会再响应触摸事件。

    case2:当检测到时间间隔内手指没有移动,tracking属性保持YES,手指触摸下如果有(可以响应触摸事件的)内部控件,则将触摸事件传递给控件进行处理。

     

有很多新闻类的App顶部都有一个滑动菜单栏,主要模型可能是由一个UIScrollView包含多个UIButton控件组成;当你操作的时候,手指如果是很迅速的在上面划过,会发现即使手指触摸的地方有UIButton,但是并没有触发该UIButton的任何触摸事件,这就是上面提到的case1;当你手指是缓慢划过或根本就没动,才会触发UIButton的触摸事件,这是case2的情况。

上面的工作原理其实有一个属性开关来控制:delaysContentTouches。默认值为YES;如果设置为NO,则无论手指移动的多么快,始终都会将触摸事件传递给内部控件;设置为NO可能会影响到UIScrollView的滚动功能。

解决办法:

设置tableView的delaysContentTouches属性为NO

_mainTableView.delaysContentTouches = NO;


这样就能解决按钮点击延时显示高亮态的问题,但是这也会带来一个新的问题,就是上边已经描述过的,如果点击到按钮的时候,整个UITableView或者说是UIScrollView是不可以滑动的,只能点击按钮以外的区域才可滑动,本人看了一些成熟的APP,他们大多数也是把这一属性设置为NO的,比如说阿里的天猫商城等APP。设置后的效果如下图所示:






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值