3

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

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

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

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

有什么建议吗?

4

2 回答 2

0

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

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

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

  • 在你的菜单视图和它的超级视图上覆盖hitTest:withEvent:pointInside:withEvent,以通知操作系统你对事件做出响应,即使超出了它的正常范围。

于 2013-05-07T14:15:52.823 回答
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

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

于 2016-11-24T11:28:53.547 回答