CGRect Contains Point 不适用于不同的视图

Posted

技术标签:

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

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

【问题讨论】:

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

以上是关于CGRect Contains Point 不适用于不同的视图的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 CGPath 和 CGRect 的交集? [复制]

A linked list is given such that each node contains an additional random pointer which could point t

Check Point SSL Network Extender 适用于 FF,而非 Safari,适用于 Mountain Lion

以编程方式添加时,rightAnchor 约束不适用 - swift

Point云库API的语言支持

UILabel swift的圆角