我有一个UIView高30,比我添加一个UITableView作为子视图,其中30作为origin.y。因为表保持在主视图“下”,所以我无法选择单元格。因此我实施了这种方法:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"Tocco intercettato");
if (oldSet && oldEvent) {
[table touchesEnded:oldSet withEvent:oldEvent];
}
oldSet = touches;
oldEvent = event;
[table touchesBegan:touches withEvent:event];
[table touchesEnded:touches withEvent:event];
}
水龙头工作,但幻灯片不起作用,因此我无法滑动桌子。一些想法才能解决?
答案 0 :(得分:1)
将覆盖的UIView的触摸传递到底层的UITableView不起作用(正如您所看到的,点击通过而不是滚动动作)。这是因为UITableView(作为UIScrollView的子类)用响应者链做各种各样的引擎式怪异(你的代码也有点奇怪,你可以从上面的视图的touchesBegan方法调用touchesBegan和touchesEnded,但是这个不是为什么你不能滚动表格。)
实现所需内容的一种简单方法(假设我已正确理解)是覆盖覆盖视图上的hitTest:withEvent:
方法并让方法返回基础UITableView(而不是self
,这是默认实现):
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UITableView *tv = (UITableView *)[self.superview.subviews objectAtIndex:0];
return tv;
}
请注意,此代码假定UITableView
是添加到视图控制器的第一个视图,之后添加了覆盖的UIView
。
编辑:好的,重新阅读您的问题后,我想我理解您的问题。您有一个高度为30的主视图,并且在该视图中,您在y = 30处添加了一个UITableView。我认为将此方法添加到主视图中将满足您的需求:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (point.y < self.frame.size.height) {
return self;
} else {
return myTableView; // assumes myTableView is a reference to the
// UITableView that you've added
}
}
基本上,如果操作系统超出了主视图的范围,则告诉操作系统将所有触摸传递给myTableView
。
然而,更简单的方法是将30像素高的主视图(橙色的东西)和UITableView都添加为另一个视图(或视图控制器)的子视图。这样,您就不必做任何事情来使您的表格像普通表一样。