【问题标题】:CGRectContainsPoint does not work on different viewsCGRect Contains Point 不适用于不同的视图
【发布时间】:2016-08-15 14:42:52
【问题描述】:

我正在制作一个简单的拖放项目。当我使用CGRectContainsPoint 将视图拖放到不同的视图上时,它可以工作。但是两个视图应该在同一个视图中。现在假设我有一个名为“A”的视图,它包含两个视图。一个UIView 和一个UIStackView。如果我将 Stack View 内的视图拖到 UIView 它不会下降。简单的CGRectContainsPoint 不适用于从不同视图拖放。有什么办法可以解决吗?

【问题讨论】:

  • 每个视图都有自己的坐标系。在使用CGRectContainsPoint之前,您是否先将坐标转换为公共系统?
  • 不,我不知道。如何转换它?
  • UIView中有几个convert方法:见Converting Between View Coordinate Systems
  • 感谢您的帮助,但您能举个例子吗?这让我很困惑。
  • 在使用CGRectContainsPoint 的地方显示您的代码。然后,我可以为您提供一个具体且希望对您有所帮助的示例。

标签: ios swift uiview cgrect uistackview


【解决方案1】:

由于每个视图都有自己的坐标系,因此您必须在比较它们之前将所有坐标转换为相同的坐标系(例如使用CGRectContainsPoint。并且您需要了解每个点或矩形,它在哪个坐标系中是给定的。Apple 总是在文档中指定它。

作为公共坐标系,选择公共父级或窗口之一。

在您的情况下,您比较视图的中心是否位于另一个视图的边界内。所以选择一个共同的父视图作为参考坐标系,例如视图控制器主视图:

在斯威夫特中:

let referenceView = self.view // assuming self is the view controller
let dropArea = referenceView.convertRect(self.dropAreaView1.bounds, fromView: self.dropAreaView1)
let center = referenceView.convertPoint(sender.view!.center, fromView: sender.view!.superview)
if CGRectContainsPoint(dropArea, center) {
   // do something
}

注意frame 指定了超级视图坐标系中的边界。因此,我将其更改为bounds,它在视图的onw 坐标系中指定了它。此外,center 使用超级视图的坐标系。因此,我将点从超级视图的系统转换为参考视图的系统。

【讨论】:

  • 出现了一个新问题。它曾经被放置在视图的中心。但不是它被放置在视图上的随机位置。
  • 所涉及的坐标可能比您在小代码 sn-ps 中显示的坐标多。您是否也将它们转换为正确的坐标系或从正确的坐标系转换?您可能想用更多的代码开始一个新问题。
  • 如果 CGRectContainsPoint(dropArea, center) {}。我正在使用这段代码来执行拖放操作,感谢您,它可以完美运行。但现在它不会落在 dropAreaView1 的中心。当我使用框架而不是边界时,我做到了。我认为现在这是造成问题的原因。 referenceView.convertRect(self.dropAreaView1.bounds, fromView: self.dropAreaView1)。但我可能错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2013-06-30
  • 2010-09-29
  • 1970-01-01
  • 2017-04-04
  • 2019-04-11
  • 1970-01-01
相关资源
最近更新 更多