UIScrollView delaysContentTouches

半年不动的代码产品说有问题,原因是 UISlider 滑动不灵敏,要手指先触摸一下,按上去才能滑动。场景是 UISlider 添加在了UITableViewCell 上。

因为项目中是继承了 UISlider ,所以,很简单的解决方案,在项目中,把UISlider 从新生成一个,放在一个什么事件都不处理的 UIView 上。看看效果。结果很流畅。所以问题肯定出在UITableView 或者 UITableViewCell 上。

查看UITableView 以及 UIScrollView 的文档。

@property(nonatomic) BOOL delaysContentTouches;       // default is YES. if NO, we immediately call -touchesShouldBegin:withEvent:inContentView:. this has no effect on presses

发现 delaysContentTouches 属性。默认为YES, 如果设置为NO ,会立即响应 touchesShouldBegin 方法。。。

解决方案

_tableView.delaysContentTouches = NO;
        [_tableView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if ([obj isKindOfClass:[UIScrollView class]]) {
                UIScrollView *_s = (UIScrollView *)obj;
                _s.delaysContentTouches = NO;
            }
        }];


关闭掉tableview 所有的 delaysContentTouches 方法。

后来测试说,在iOS7上还是不灵敏。。嗯哼?经过测试iOS7 UITableViewCell 上的scrollView 也会开启,所以在创建cell 的时候,用同样的手段,,

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        [self setup];
        ///#FIX iOS7 滑动不灵敏
        for (UIView *view in self.subviews) {
            if([view isKindOfClass:[UIScrollView class]]) {
                ((UIScrollView *)view).delaysContentTouches = NO;
                break;
            }
        }
    }
    return self;
}

OK 万事大吉。。。

你可能感兴趣的:(UIScrollView delaysContentTouches)