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