【问题标题】:How do I get the tap coordinates on a custom UIButton?如何获取自定义 UIButton 上的点击坐标?
【发布时间】:2012-08-04 14:04:25
【问题描述】:

我在 iPad 上使用 XCode 4.4 为 iOS 5 开发,并在创建自定义按钮时使用 Storyboard 布局。

我的触摸事件正常工作并记录,但现在我想获取自定义按钮上点击的 x/y 坐标。

如果可能,我希望坐标相对于自定义按钮,而不是相对于整个 iPad 屏幕。

这是我在 .h 文件中的代码:

- (IBAction)getButtonClick:(id)sender;

和我在 .m 文件中的代码:

    - (IBAction)getButtonClick:(id)sender {

        NSLog(@"Image Clicked.");
    }

就像我说的,当我点击图像时,它会正确记录。

如何获取水龙头的坐标?

我尝试了一些来自互联网的不同示例,但当它在日志框中显示一堆数字(可能是坐标)时,它们总是冻结。我对 iOS 开发非常陌生,所以请让它尽可能简单。谢谢!

【问题讨论】:

  • Artern 提出了正确的问题。您真的需要知道按钮内的坐标,还是只想知道单击了哪个按钮(在这种情况下,您不需要弗拉基米尔对“发送者和事件”的出色建议),而是您可以只看在sender 确定单击了哪个按钮。
  • 我需要坐标,因为我将图像显示为 UIButton,并且我需要知道用户在该图像上点击的位置。我已经知道如何判断点击了哪个按钮。

标签: ios xcode ipad uibutton storyboard


【解决方案1】:

要获取触摸位置,您可以使用按钮操作方法的另一种变体:myAction:forEvent:(如果您从 IB 界面注释“参数字段中的“发送者和事件”选项创建它:)

然后在您的动作处理程序中,您可以从事件参数中获取触摸位置,例如:

- (IBAction)myAction:(UIButton *)sender forEvent:(UIEvent *)event {
    NSSet *touches = [event touchesForView:sender];
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:sender];
    NSLog(@"%@", NSStringFromCGPoint(touchPoint));
}

【讨论】:

  • 感谢您的详细解答。但是,当我从网上尝试其他代码时,我仍然遇到同样的错误。 “无法识别的选择器发送到实例 0xde26e40 2012-08-07 10:29:36.126 差异 [41044:707] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[DifferencesViewController getButtonClick:]:无法识别的选择器发送到instance 0xde26e40'" 有什么想法吗?
  • @user1262552,您的按钮操作仍然有 getButtonClick: 方法,请检查您的故事板文件或代码以确保按钮操作与视图控制器的现有方法相关联
  • 当我点击图片时,应用程序似乎冻结了。
  • 谢谢你,瓦尔迪米尔。这就是问题所在。现在,我的坐标准确地显示了我想要它们的方式。再次感谢!
  • 2015 年仍在帮助开发者!
【解决方案2】:

在 Swift 3.0 的情况下,接受的答案相同,但语法将更改如下:

Swift 3.0:

 @IBAction func buyTap(_ sender: Any, forEvent event: UIEvent) {
     let myButton = sender as! UIButton
     let touches = event.touches(for: myButton)
     let touch = touches?.first
     let touchPoint = touch?.location(in: myButton)
     print("touchPoint\(touchPoint)")
  }

【讨论】:

    【解决方案3】:

    对于您的整体坐标(参考屏幕),您需要创建一个包含您的触摸坐标的CGPoint。但要做到这一点,你需要先接触到这一点。因此,从获取触摸事件开始,然后使用locationInView 方法说明这一点。现在,根据您想要记录触摸的时间 - 当用户按下或抬起手指时 - 您必须在 touchesBegantouchesEnded 方法中实现此代码。假设您执行touchesEnded,它传递了一个包含所有触摸事件的NSSet cales "touches"。

    UITouch *tap = [touches anyObject];
    CGPoint touchPoint = [tap locationInView:self.view];
    

    “touchPoint”现在将包含用户抬起手指的点。要打印出坐标,您只需访问该点的 x 和 y 属性:

    CGFloat pointX = touchPoint.x;
    CGFloat pointY = touchPoint.y;
    NSLog(@" Coordinates are: %f, %f ", pointX, pointY);
    

    这应该输出触摸的坐标。现在要将它引用到您正在使用的任何按钮,我建议您只需从该点手动减去按钮坐标的值。这似乎是一个简单的解决方案,老实说,我不知道获取参考另一个对象的坐标的方法,除非您基于该对象创建视图,并将其传递给 locationInView 而不是 self.view

    有关触摸的更多信息,有很多教程here

    【讨论】:

      猜你喜欢
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多