堆叠UITableViews不会在其视图下传递触摸事件

时间:2011-11-14 20:35:05

标签: uitableview uiview uievent

我将3个UIView堆叠在另一个

之上

的UITableView
的PlaneView
rootView

TableView位于顶部,rootView位于底部。 (因为TableView位于其上,所以rootView不可见)

我在rootView中实现了以下代码

/*code in rootView*/



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {}  

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {} 

期望在触摸或移动最顶层视图(即TableView)时调用这些函数,但相反没有调用任何函数。

我还尝试在TableView中放入以下代码,以便调用rootView方法

 /*code in TableView so that the rootView methods are called(TableView is the subview of rootView)*/

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 {
[super touchesBegan:touches withEvent:event];
[self.superview touchesBegan:touches withEvent:event];
 }

正如所料,它是这样做的,但问题是TableView委托像

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath    

未被调用。

有没有什么方法可以确保在TableView类(didSelectRow :)中实现的TableView委托和rootView中的touchesBegan:,touchesMoved ..函数也会相应调用?

即当我点击TableCell时(didSelectRow:atIndex)函数 - >调用 - > rootView中的TableView和(touchesBegan和touchesEnd)方法。

2 个答案:

答案 0 :(得分:5)

UITableView的子类中,你应该有这样的触摸方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.nextResponder touchesBegan:touches withEvent:event];
    [super touchesBegan:touches withEvent:event];
}

这里的不同之处在于,您将触摸传递给下一个响应者而不是超级视图,并且在将触摸传递给super之前,您正在执行此操作

然后在planeView中,您需要传递这样的内容:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.superview touchesBegan:touches withEvent:event];
}

请注意,这仍然可能无法完全按预期工作。 UITableView在引擎盖下对响应者链进行了大量修改,以使其看起来好像UITableView(实际上是一个复杂的子视图集合)只是另一个视图,如按钮或标签。

答案 1 :(得分:0)

这些都不适合我

解决它的原因很简单:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    let view = super.hitTest(point, with: event)
    return view == self ? nil : view
}

参考这篇文章:https://medium.com/@nguyenminhphuc/how-to-pass-ui-events-through-views-in-ios-c1be9ab1626b