将触摸事件转发给 UITableView 产生惯性滚动
Forward touch event to UITableView to produce inertia scroll
我一直在尝试将触摸事件从一个视图转发到 UITableView
。但是我遇到了一个问题。
图中是一个原型视图来说明问题。下半部分的白色视图是正常的UITableView
。黄色视图是 UIView
,它使用 hitTest:withEvent:
将触摸转发到 UITableView
的中间。红色视图是 UIButton
.
目标是将向上和向下平移触摸从黄色视图转发到底部的 UITableView
。但是,点击红色 UIButton
应该仍然有效。
我尝试了两种主要方法,但都存在问题。
第一种方法是在黄色视图中添加UIPanGestureRecognizer
,可以用来设置UITableView
的contentOffset
。问题是 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 以使其以某种方式工作?有没有办法在保持惯性滚动的同时做到这一切?
- 您需要将
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)];
希望对您有所帮助。
我一直在尝试将触摸事件从一个视图转发到 UITableView
。但是我遇到了一个问题。
图中是一个原型视图来说明问题。下半部分的白色视图是正常的UITableView
。黄色视图是 UIView
,它使用 hitTest:withEvent:
将触摸转发到 UITableView
的中间。红色视图是 UIButton
.
目标是将向上和向下平移触摸从黄色视图转发到底部的 UITableView
。但是,点击红色 UIButton
应该仍然有效。
我尝试了两种主要方法,但都存在问题。
第一种方法是在黄色视图中添加UIPanGestureRecognizer
,可以用来设置UITableView
的contentOffset
。问题是 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 以使其以某种方式工作?有没有办法在保持惯性滚动的同时做到这一切?
- 您需要将
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)];
希望对您有所帮助。