获取UIView相对于其超级视图的位置


97

我有一个UIView,其中安排了UIButtons。我想找到那些UIButton的位置。

我知道这buttons.frame将给我职位,但仅就其直接监督而言,它只会给我职位。

关于UIButtons超级视图的超级视图,有没有办法找到这些按钮的位置?

例如,假设有一个名为“ firstView”的UIView。

然后,我有另一个UIView,“ secondView”。该“ SecondView”是“ firstView”的子视图。

然后,我将UIButton作为“ secondView”的子视图。

->UIViewController.view
--->FirstView A
------->SecondView B
------------>Button

现在,有什么方法可以找到该UIButton相对于“ firstView”的位置?

Answers:


192

您可以使用此:

物镜

CGRect frame = [firstView convertRect:buttons.frame fromView:secondView];

迅速

let frame = firstView.convert(buttons.frame, from:secondView)

文档参考:

https://developer.apple.com/documentation/uikit/uiview/1622498-convert


要添加此内容,如果您的视图并不总是在同一视图中(例如,如果您在函数中使用此视图),则可以输入'... fromView:[button superview]];'。
mylogon

39

尽管并非按要求特定于层次结构中的按钮,但我发现这更易于可视化和理解:

从这里:原始来源

在此处输入图片说明

对象:

CGPoint point = [subview1 convertPoint:subview2.frame.origin toView:viewController.view];

迅速:

let point = subview1.convert(subview2.frame.origin, to: viewControll.view)

20

为Swift 3更新

    if let frame = yourViewName.superview?.convert(yourViewName.frame, to: nil) {

        print(frame)
    }

在此处输入图片说明


7

框架:(X,Y,宽度,高度)。

因此,即使在超级超级视图中,宽度和高度也不会改变。您可以按照以下方式轻松获得X,Y。

X = button.frame.origin.x + [button superview].frame.origin.x;
Y = button.frame.origin.y + [button superview].frame.origin.y;

但是为什么我得到的X,Y值如此之高,例如当我的X为0,0时,我却得到了如下代码行:180224左右?

5

如果有多个视图堆叠在一起,并且您不需要(或不想)知道您感兴趣的视图之间的任何可能的视图,则可以这样做:

static func getConvertedPoint(_ targetView: UIView, baseView: UIView)->CGPoint{
    var pnt = targetView.frame.origin
    if nil == targetView.superview{
        return pnt
    }
    var superView = targetView.superview
    while superView != baseView{
        pnt = superView!.convert(pnt, to: superView!.superview)
        if nil == superView!.superview{
            break
        }else{
            superView = superView!.superview
        }
    }
    return superView!.convert(pnt, to: baseView)
}

这里targetView将是按钮,baseView将是ViewController.view
该函数尝试执行的操作如下:
如果targetView没有超级视图,则返回其当前坐标。
如果targetView's超级视图不是baseView(即,按钮和之间还有其他视图viewcontroller.view),则检索转换后的坐标并将其传递给next superview
在移向baseView的视图堆栈中,它继续执行相同的操作。
到达时baseView,它将进行最后一次转换并将其返回。
注意:它不能处理targetView位于下方的情况baseView


4

UIView扩展,用于转换子视图的框架(受@Rexb答案启发)。

extension UIView {

    // there can be other views between `subview` and `self`
    func getConvertedFrame(fromSubview subview: UIView) -> CGRect? {
        // check if `subview` is a subview of self
        guard subview.isDescendant(of: self) else {
            return nil
        }

        var frame = subview.frame
        if subview.superview == nil {
            return frame
        }

        var superview = subview.superview
        while superview != self {
            frame = superview!.convert(frame, to: superview!.superview)
            if superview!.superview == nil {
                break
            } else {
                superview = superview!.superview
            }
        }

        return superview!.convert(frame, to: self)
    }

}

// usage:
let frame = firstView.getConvertedFrame(fromSubview: buttons.frame)

2

您可以轻松获得以下超级超级视图。

secondView-> [按钮
超级视图] firstView-> [[按钮超级视图] 超级视图]

然后,您可以获得按钮的位置。

您可以使用此:

xPosition = [[button superview] superview].frame.origin.x;
yPosition = [[button superview] superview].frame.origin.y;

2
添加一些解释会使此答案更有用。
萨加尔·萨拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.