iOS7/8 UITableView/UIScrollView上UIButton不能立即响应高亮的原因及解决办法

如果UIButton比较常见的作为UITableViewCell里的子类,当你在点击它时,它默认不会立马显示高亮,这是因为iOS系统会默认会延迟150ms的时间去检查当前该事件是否能够出发UITableView的滑动,如果 NO,UIScrollView会立马将接收到的手势分发到子视图上,如果YES,默认是不显示高亮的。

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

废话不多说,直接上代码 以下是UITableView的实现

#import <UIKit/UIKit.h>
@interface TUNoDelayHighlightTableView : UITableView
@end

#import "TUNoDelayHighlightTableView.h"

@implementation TUNoDelayHighlightTableView

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self)
    {
        [self reWriteSetting];
    }
    return self;
}

- (id) initWithFrame:(CGRect)frame style:(UITableViewStyle)style
{
    if (self = [super initWithFrame:frame style:style]) {
        [self reWriteSetting];
    }
       return self;
}

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
            [self reWriteSetting];
    }
    return self;
}

- (void) reWriteSetting
{
    self.delaysContentTouches = NO;
    for (id view in self.subviews)
    {
        // looking for a UITableViewWrapperView
        if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewWrapperView"])
        {
            // this test is necessary for safety and because a "UITableViewWrapperView" is NOT a UIScrollView in iOS7
            if([view isKindOfClass:[UIScrollView class]])
            {
                // turn OFF delaysContentTouches in the hidden subview
                UIScrollView *scroll = (UIScrollView *) view;
                scroll.delaysContentTouches = NO;
            }
            break;
        }
    }

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

我在项目中遇到了这些问题并已解决,希望可以帮到你,Best wishes