我在ViewController中有2个UIImageViews,我试图在它们交叉时计算出来。
imageViewA :在我的故事板视图中,带有约束,并且位于视图层次结构中,如下所示:
- Background
-- Images
--- imageViewA
imageViewB :是动态创建的,使用UIPanGestureRecognizer在屏幕上拖动。
当拖动结束时,我想检查imageViewB是否与imageViewB相交。我使用了交叉函数,但没有得到我期望的结果,我想因为imageViewA处于层次视图中,这意味着它处于不同的坐标系中。所以我想将两个视图转换为相同的坐标系。我怎么能这样做?
我尝试了以下内容:
let frameA = imageViewA.convert(imageViewA.frame, to: self.view)
let frameB = imageViewB.convert(imageViewB.frame, to: self.view)
但它没有给我我期望的结果,哪个frameB有一个更大的Y坐标。
我需要做这样的事情:
let frameA = imageViewA.superview?.superview?.convert(imageViewA.superview?.superview?.frame, to: self.view)
还有其他一些问题涉及转换为坐标系统,但它们似乎无法解决视图在层次结构中时要执行的操作。
答案 0 :(得分:2)
您的问题是imageViewA.frame
位于imageViewA.superview
的几何(坐标系)中,但UIView.convert(_ rect: to view:)
期望rect
位于imageViewA
的几何中
最简单的解决方案是将imageViewA.bounds
(位于imageViewA
的几何体中)直接转换为imageViewB
的几何体,然后查看它是否与imageViewB.bounds
相交,它也在imageViewB
的几何中:
let aInB = imageViewA.convert(imageViewA.bounds, to: imageViewB)
if aInB.intersects(imageViewB.bounds) {
...
最简单的解决方案是转换imageViewA.bounds
,它位于imageViewA
自己的几何体中:
let frameA = imageViewA.convert(imageViewA.bounds, to: self.view)
let frameB = imageViewB.convert(imageViewB.bounds, to: self.view)
答案 1 :(得分:0)
我误解了转换功能。为了防止对其他人有用,解决方案如下所示:
let convertedFrameB = frameA.superview?.convert(frameA.frame, from self.view)
if(convertedFrameB.intersects(frameA.frame) {...
...
}
这是一个可能有用的扩展程序:
extension UIView {
func intersectsIgnoringCoordinateSpace(_ view2: UIView) -> Bool {
let frameOne = self.convert(self.bounds, to: self.topLevelView)
let frameTwo = view2.convert(self.bounds, to: self.topLevelView)
return frameOne.intersects(frameTwo)
}
var topLevelView: UIView? {
get {
var topView = self.superview
while(topView?.superview != nil) {
topView = topView?.superview
}
return topView
}
}