【问题标题】:What is the best way to determine if a line that was drawn in a view was tapped?确定在视图中绘制的线是否被点击的最佳方法是什么?
【发布时间】:2025-11-30 03:15:01
【问题描述】:

我有一个视图,其中在不同方向上绘制了几条线。我需要确定用户点击了哪条线路,然后做出相应的响应。

我有几个不同的想法,但我想要最好、最有效的方法来做到这一点......

归根结底,对我来说最有意义的是将每一行放在单独的视图中,并像单独的对象一样对待。如果我这样做了,我是否需要将视图定位并旋转到该线的确切位置,以便我知道何时点击它?如果不是,我会假设视图会相互重叠,我将无法确定点击了哪条线。

我希望我说得通。请让我知道实现这一目标的最佳方法。谢谢!

【问题讨论】:

  • 如果您使用每行一个视图的方法,您可能想在这里查看我的答案:*.com/questions/5847876/…
  • 完美!正是我的想法...如果您想将此作为答案,我会接受。

标签: ios objective-c


【解决方案1】:

对我来说,解决这个问题的最佳方法是将 UIView 创建为线条。如果它们只是带有纯色的线条,只需使用背景视图并相应地设置 CGRectFrame 。

为了在不处理位置等的情况下对触摸事件做出反应,请在 UIView 的 init 方法中创建一个 touchEvent,如下所示:

UITapGestureRecognizer *onTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lineClicked)];
 [self addGestureRecognizer:onTap];   

在 UIView 类中声明函数:

-(void)lineClicked {
  //You can check some @property here to know what line was clicked for example
  if (self.color == [UIColor blackColor])
      //do something
  else
      //do another thing

  // You can use a custom protocol to tell the ViewController that a click happened
  (**) if ([self.delegate respondsToSelector:@selector(lineWasClicked:)]) {
         [self.delegate lineWasClicked:self];
     }
}

(**) 单击该行后,您可能希望将一些逻辑放入您的 viewController 中。解决此问题的最佳方法是在您的 CustomUIView.h 文件中声明一个 @protocol 并将 self 作为参数传递,以便 viewController 知道谁被点击了:

@protocol LineClikedDelegate <NSObject>
@optional
- (void)lineWasClicked:(UIView *)line; //fired when clicking in the line
@end

最后,在您的 CustomUIView 中创建一个 @property 来指向委托:

@property id<DisclosureDelegate> delegate;

在 ViewController 中。当您将行创建为 UIViews 时,将委托设置为:

blackLine.delegate = self.

在 ViewController 中实现 - (void)lineWasClicked:(UIView *)line; 方法就可以了。

【讨论】:

  • 这也是一个很好的答案......转换代码是 Nikolai Ruhe 回答中最有帮助的。我将结合您对我的解决方案的两个建议。如果有办法我可以接受这两个答案。谢谢!
【解决方案2】:

根据要求,我将其添加为答案:

您可以使用图层而不是视图来显示线条。这在绘图中既有效又允许命中测试以确定哪条线已被点击。

Here's code 用于几何计算。

【讨论】:

    最近更新 更多