スーパービューのスーパービューに対するUIViewの位置を取得します


97

UIButtonを配置したUIViewがあります。それらのUIButtonの位置を見つけたいのですが。

私はそれbuttons.frameが私にポジションを与えることを承知していますが、それは私に直接の監督に関してのみポジションを与えます。

UIButtonsスーパービューのスーパービューに関して、これらのボタンの位置を見つける方法はありますか?

たとえば、「firstView」という名前のUIViewがあるとします。

次に、「secondView」という別のUIViewがあります。この「SecondView」は「firstView」のサブビューです。

次に、「secondView」のサブビューとしてUIButtonがあります。

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

では、「firstView」を基準にして、UIButtonの位置を見つける方法はありますか?

回答:


192

あなたはこれを使うことができます:

Objective-C

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 2015年

39

尋ねられたように階層内のボタンに固有ではありませんが、これを視覚化して理解する方が簡単であることがわかりました。

ここから:元のソース

ここに画像の説明を入力してください

ObjC:

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、width、height)。

したがって、幅と高さはスーパースーパービューに対しても変化しません。次のように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、その現在の座標が返されます。スーパービューがbaseViewではない
場合targetView's(つまり、ボタンとの間に他のビューがある場合viewcontroller.view)、変換された座標が取得され、次のに渡されますsuperview
baseViewに向かって移動するビューのスタックを通じて、同じことを続けます。
に到達するとbaseView、最後の変換を1つ実行して返します。
注: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
いくつかの説明を追加すると、この回答がより有用になります。
Sagar Zala
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.