根据其 ViewcController 查看中心 - iOS Swift

View center according to its ViewcController - iOS Swift

我在另一个 UIView 里面有一个 UIView

根据 ViewController View 而不是其 superView 设置内部 UIView 位置的最佳方法是什么?

func answerViewTapAction(sender: UITapGestureRecognizer) {
    if let myViewIndex = returnActiveView() {
        var choosenView: numberView!
        print("view \(myViewIndex) will move to slot \(sender.view!.tag)")
        for noView in noViews {
            if noView.tag == myViewIndex {
                choosenView = noView
            }
        }
        //print(choosenView.center)
        print(sender.view!.center)
        UIView.animateWithDuration(0.7, animations: {
            choosenView.center = CGPoint(
                x: CGRectGetMidX(sender.view!.frame),
                y: CGRectGetMidY(sender.view!.frame))
        })
    }else {
        print("view will not move")
    }   
}

我想根据ViewController访问我的sender.view中心,而不是根据它的superView

您需要 UIViewconvertPoint 方法。特别是 convertPoint(_ point: CGPoint, toView view: UIView?) -> CGPointDocumentation here.

如果您需要示例,请告诉我。您只需要调用它一次并传递 toView 您想要弄清楚的视图的超级视图。

编辑:我们开始举例!

让我们考虑三个视图:A、B 和 C。还有一个奇特的 ASCII 艺术。

(0, 0, 20, 20)
+----------------------------------+
| A                                |
|    (5, 5, 10, 10)                |
|    +--------------------+        |
|    |B                   |        |
|    |    (5, 5, 5, 5)    |        |
|    |    +-----------+   |        |
|    |    |C          |   |        |
|    |    |           |   |        |
|    |    |           |   |        |
|    |    |           |   |        |
|    |    |           |   |        |
|    |    |           |   |        |
|    |    |           |   |        |
|    |    +-----------+   |        |
|    |                    |        |
|    |                    |        |
|    +--------------------+        |
|                                  |
|                                  |
|                                  |
+----------------------------------+

视图 A 是 ViewController.view,它位于 X: 0,Y: 0,宽度:20,高度:20。 视图 B 是 A 的子视图,根据视图 A,它位于 X:5,Y:5,宽度:10,高度:10。 视图 C 是 B 的子视图,根据视图 B,它位于 X:5,Y:5,宽度:5,高度:5。 但是根据视图 A,C 实际上位于 X:10,Y:10,因为视图 ​​B 位于 5、5。 因此,我们需要根据视图 A 找出视图 C 的来源是 convertPoint.

方法:

let originOfC = B.convertPoint(C.frame.origin, toView: A)

就是这样。您可以使用 fiew 循环以编程方式执行相同的操作,但上面的示例更清晰一些。现在我已经给你举了一个起源的例子。要获得中心,您可以使用 view.center 属性 或将 C 宽度的一半添加到 originOfC 的 x 坐标,并将高度的一半添加到 originOfC 的 y 坐标。