TouchesBegan不是在UIView中作为UITableViewCell的子视图触发的

时间:2013-05-07 13:59:57

标签: iphone uitableview addsubview touchesbegan

我正在UITableView的单元格内创建一个自定义下拉菜单,将此菜单添加为单元格内容视图的子视图。

当我单击单元格内的菜单时,我放大视图以显示所有菜单项:现在菜单视图位于tableView和所有单元格上。

因此,当我选择自定义视图中的项目时,TouchesBegan仅在视图的部分触发,该部分位于我调用菜单的UITableView单元格上,而不是在我放大的所有视图中。 / p>

如果我触摸了另一个单元格中的部分视图,那么TouchesBegan会在表格视图的单元格中触发,而不是在所有单元格顶部的视图中触发。

有什么建议吗?

2 个答案:

答案 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将被传递到视图及其层次结构