TouchesBegan 没有在 UIView 中作为 UITableViewCell 的子视图触发

Posted

技术标签:

【中文标题】TouchesBegan 没有在 UIView 中作为 UITableViewCell 的子视图触发【英文标题】:TouchesBegan not triggered in UIView as subview of UITableViewCell 【发布时间】:2013-05-07 13:59:57 【问题描述】:

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

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

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

如果我部分触摸位于另一个单元格上方的视图,TouchesBegan 将在表格视图的单元格中触发,而不是在所有单元格顶部的视图中。

有什么建议吗?

【问题讨论】:

【参考方案1】:

视图通常不会响应视图上的触摸事件或在其边界之外绘制的部分视图。有几个可能的选项可以解决此问题:

当下拉菜单可见时放大单元格以适应整个菜单,但这可能会对视觉效果产生负面影响,具体取决于您的设计。

在控制器上添加菜单而不是单元格视图。如果您有这条路线,您可以使用表格视图中的UIScrollViewDelegate 事件在用户滚动表格时重新定位菜单。请记住考虑菜单显示在最后一个单元格上的情况,如果始终向下绘制,可能会过度绘制控制器的边界。

在您的菜单视图及其上级视图上覆盖 hitTest:withEvent:pointInside:withEvent,以通知操作系统您对超出正常范围的事件做出响应。

【讨论】:

我暂时解决了你提出的第一个解决方案。我尝试过覆盖 hitTest 和 pointInsid 但每次我触摸我在另一个单元格中的另一个菜单上放大的视图时,系统都会触发 histTest在我放大视图下的视图中。【参考方案2】:

以下内容对我有用:

子类化您的单元格并将布局的根视图与单元格连接起来:

@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

现在 touchesBegin/Move/End/Cancel 将被传递到视图,并且每当触摸在该视图内时,它的层次结构

【讨论】:

以上是关于TouchesBegan 没有在 UIView 中作为 UITableViewCell 的子视图触发的主要内容,如果未能解决你的问题,请参考以下文章

如何在 touchesBegan 上的自定义 UIView 中调整 UILabel 位置?

可拖动的 UIView 在添加到 UIScrollView 后停止发布 touchesBegan

为啥 touchesbegan:在使用 UIPinchGestureRecognizer 后从不会在 UIView 上被调用?

uiview 的一部分不会调用 touchesBegan 以在 uisplitview 上查看

touchesBegan 不能在 iOS 中的 UIView 上工作?

TouchesBegan 总是返回错误的 UIView