scroll上的button延迟响应问题

UIButton在某些情况下不能立刻响应TouchDown事件,换句话说,迅速点击按钮时,你是永远看不见这个按钮的高亮状态的. 出现这种情况时,这些按钮都在UIScrollView的子类上.这是因为 scroll有一个属性delaysContentTouches,默认值为YES.值为YES时,UIScrollView会在接收到手势时延迟150ms来判断该手势是否能够出发UIScrollView的滑动事件.

解决方案:

1、将UIButton所有属于UIScrollView的父视图的delaysContentTouches属性设置成为NO,此时UIScrollView会立马将接收到的手势分发到子视图上。

  • 其中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。

2、仅仅设置属性是不够的,因为如果想要拖动scrollView而起点落在其他有手势识别的视图上时会拖不动

  • (BOOL)touchesShouldCancelInContentView:(UIView *)view

    这个方法决定手势是否取消传递到view上,拖动ScrollView时触发。返回NO时,拖动手势将留在ScrollView上,返回YES则将手势传到view上。(若view是UIControl,则默认返回YES)

继承UIScrollView或UITableView,并重写此方法,让其响应拖动方法。

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
if ([view isKindOfClass:[UIButton class]])
{
return YES;
}
return [super touchesShouldCancelInContentView:view];
}

Last updated