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

时间:2017-01-13 09:53:57

标签: ios uitableview touch uigesturerecognizer

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

prototype app to illustrate problem

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

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

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

第一种方法是将UIPanGestureRecognizer添加到黄色视图中,该视图可用于设置contentOffset的{​​{1}}。问题是表格视图的惯性滚动不适用于这种方法。

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

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:,以保持红色按钮正常工作并允许拖动工作以红色按钮开始工作?我应该覆盖黄色视图中的touch event methods以使其以某种方式工作吗?有没有办法在保持惯性滚动的同时做到这一切?

1 个答案:

答案 0 :(得分:1)

  1. 您需要在yellowView
  2. 中添加UITableView作为子视图
  3. 您还需要照顾contentInset 容纳yellowView身高。
  4. 默认情况下,您需要在已添加的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)];
    
  5. 希望这有帮助。