我正在UITableView的单元格内创建一个自定义下拉菜单,将此菜单添加为单元格内容视图的子视图。
当我单击单元格内的菜单时,我放大视图以显示所有菜单项:现在菜单视图位于tableView和所有单元格上。
因此,当我选择自定义视图中的项目时,TouchesBegan仅在视图的部分触发,该部分位于我调用菜单的UITableView单元格上,而不是在我放大的所有视图中。 / p>
如果我触摸了另一个单元格中的部分视图,那么TouchesBegan会在表格视图的单元格中触发,而不是在所有单元格顶部的视图中触发。
有什么建议吗?
答案 0 :(得分:0)
视图通常不响应视图上的触摸事件或在其边界之外绘制的视图部分。有几种可能的方法可以解决这个问题:
当下拉菜单可见时,放大单元格以适合整个菜单,但这可能会对视觉效果产生负面影响,具体取决于您的设计。
在控制器上添加菜单而不是单元格视图。如果您有此路线,则可以使用表格视图中的UIScrollViewDelegate
事件在用户滚动表格时重新定位菜单。请记住在最后一个单元格中显示菜单的情况,如果总是向下绘制,则可能会过度绘制控制器的边界。
在菜单视图及其超级视图上覆盖hitTest:withEvent:
和pointInside:withEvent
,以通知操作系统您甚至超出其正常范围即可响应事件。
答案 1 :(得分:0)
以下对我有用:
对您的单元格进行子类化,并将布局的根视图与单元格连接:
@interface CustomCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UIView *rootView;
@end
覆盖单元格的hitTest,如下所示:
@implementation CustomCell
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
BOOL res = [self.rootView pointInside:point withEvent:event];
if(res){
return [self.rootView hitTest:point withEvent:event];
}
return [super hitTest:point withEvent:event];
}
@end
现在,只要触摸在该视图内,touchchesBegin / Move / End / Cancel将被传递到视图及其层次结构