当UIViews处于层次结构

时间:2017-01-26 12:54:34

标签: ios swift swift3

我在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)

还有其他一些问题涉及转换为坐标系统,但它们似乎无法解决视图在层次结构中时要执行的操作。

2 个答案:

答案 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) {
    ...

ORIGINAL

最简单的解决方案是转换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
    }
}