将触摸事件转发给 UITableView 产生惯性滚动

Forward touch event to UITableView to produce inertia scroll

我一直在尝试将触摸事件从一个视图转发到 UITableView。但是我遇到了一个问题。

图中是一个原型视图来说明问题。下半部分的白色视图是正常的UITableView。黄色视图是 UIView,它使用 hitTest:withEvent: 将触摸转发到 UITableView 的中间。红色视图是 UIButton.

目标是将向上和向下平移触摸从黄色视图转发到底部的 UITableView。但是,点击红色 UIButton 应该仍然有效。

我尝试了两种主要方法,但都存在问题。

第一种方法是在黄色视图中添加UIPanGestureRecognizer,可以用来设置UITableViewcontentOffset。问题是 table 视图的惯性滚动不适用于这种方法。

第二种方法是在黄色视图中使用 hitTest:withEvent: 转发触摸。

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if([self.button_red pointInside: [self convertPoint:point toView:self.button_red] withEvent:event]) {
        return self.button_red;
    } else {
        return [self.view_table hitTest:CGPointMake(self.view_table.width/2.0,self.view_table.height/2.0) withEvent:event];
    }
}

hitTest:withEvent: 仅在黄色视图中开始触摸时调用。换句话说,无论何时在红色视图中开始拖动,它都不会将拖动转发到 table 视图。这还不够好。

是否有可能以不同的方式将平移手势从黄色视图转发到 UITableView,以保持红色按钮工作并允许从红色按钮开始的拖动工作?我是否应该覆盖黄色视图中的 touch event methods 以使其以某种方式工作?有没有办法在保持惯性滚动的同时做到这一切?

  1. 您需要将 yellowView 添加为 UITableView 中的子视图。
  2. 您还需要注意 contentInset 以便 适应 yellowView 高度。
  3. 默认情况下,单元格会出现在这个添加的yellowView之上,你需要 通过调整 yellowView 上的 zPosition 来解决这个问题。

    CGFloat height = CGRectGetHeight(yellowView.frame);
    
    // fix yellowView's y position
    yellowView.frame = CGRectMake(0, -height, CGRectGetWidth(yellowView.frame), height); 
    
    [tableView addSubview:yellowView];
    yellowView.layer.zPosition = 10; // make it appear over cells
    
    [tableView setContentInset:UIEdgeInsetsMake(height, 0, 0, 0)];
    

希望对您有所帮助。