我一直在尝试将触摸事件从一个视图转发到UITableView
。但我遇到了一个问题。
图中是一个原型视图来说明问题。下半部分的白色视图是正常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以使其以某种方式工作吗?有没有办法在保持惯性滚动的同时做到这一切?
答案 0 :(得分:1)
yellowView
。UITableView
作为子视图
contentInset
容纳yellowView
身高。默认情况下,您需要在已添加的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)];
希望这有帮助。