为什么UITableViewCell上的UIButton只在触摸手势持续很短的时间内绘制得更暗

Alb*_*Chu 2 uibutton uitableview ios

快速按下按钮而不是短时间按住,不会突出显示该按钮.不同于UIButton一个共同的UIView.

就像官方Twitter客户端的头像照片一样.
Instagram客户端似乎解决了这个问题,所有按钮都运行良

在这里找到相同的问题:
为什么UIButton showsTouchWhenHighlighted不在按钮在UITableViewCell上时工作?

但我仍然不知道如何解决它.

sta*_*Man 8

嗯... a UITableView是一个子类,UIScrollView并且UIScrollView已知该类为了它自己的目的而接触.
当它意识到触摸不适合它时,它将它传递给它的直接子视图.
功能delaysContentTouches属性(默认情况下是YES).

这就是为什么,UIButton只有在延长触摸之后它才会突出显示状态,因为触摸事件是UITableView短暂的,直到它确定触摸是用于滚动还是滑动单元格并且实现触摸是否适用于它们,它立即将触摸事件传递给它subView正下方.

在快速点击的情况下,由于此延迟而绕过按钮的突出显示状态,并且直接调用目标选择器方法.


要显示按钮的突出显示状态UITableView(就像在a上一样UIView),请执行以下操作:

对于iOS7 +:

-viewDidLoad任何适当的地方做:

[yourTableViewObject setDelaysContentTouches:NO];
Run Code Online (Sandbox Code Playgroud)

另外...... cell.subviews有一个UITableViewCellScrollView显然是另一个的类,scrollView我们也需要禁用delaysContentTouches这个类的属性.

所以...在-cellForRowAtIndexPath:方法中(就在之前return cell;)做:

NSArray *test = cell.subviews;
for (UIView *currentView in cell.subviews) {
    if ([NSStringFromClass([currentView class]) isEqualToString:@"UITableViewCellScrollView"]) {
        UIScrollView *svTemp = (UIScrollView *) currentView;
        [svTemp setDelaysContentTouches:NO];
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于iOS 6-:

在iOS6中,cell.subviews有一个UITableViewCellContentView不是scrollView子类的类,所以它只需要为tableView单独设置一个参数.

因此,在-viewDidLoad任何适当的地方,这就是您需要的一切:

[yourTableViewObject setDelaysContentTouches:NO];
Run Code Online (Sandbox Code Playgroud)

PS:通过这样做,它会搞乱滚动,tableView所以使用你更好的判断.

  • 通过http://stackoverflow.com/questions/17701323/uiscrollview-delayscontenttouches-issue解决了这个问题,我将UITableView子类化,添加touchesShouldCancelInContentView:方法,并始终返回YES.但是只有在[myTableViewObject setDelaysContentTouches:NO]调用我分配tableView的地方时才能正常工作,而不是UITableView子类init方法. (2认同)