it-swarm.com.de

Erhalten Sie die Position von UIView in Bezug auf den Superview-Überblick

Ich habe eine UIView, in der ich UIButtons angeordnet habe. Ich möchte die Positionen dieser UIButtons finden. 

Ich bin mir bewusst, dass buttons.frame mir die Positionen geben wird, aber es wird mir Positionen nur hinsichtlich seines unmittelbaren Überblicks geben. 

Gibt es eine Möglichkeit, die Positionen dieser Tasten in Bezug auf UIButtons Superview-Überblick zu finden? 

Angenommen, es gibt UIView mit dem Namen "firstView".

Dann habe ich eine andere UIView, "secondView". Diese "SecondView" ist eine Unteransicht von "firstView". 

Dann habe ich UIButton als Unteransicht auf der "secondView". 

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

Gibt es eine Möglichkeit, die Position dieses UIButton in Bezug auf "firstView" zu finden?

65
Shailesh

Sie können dies verwenden:

Ziel c

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

Swift

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

Referenz der Dokumentation: 

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

147
mprivat

Aktualisiert für Swift 3

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

        print(frame)
    }

 enter image description here

15
iajmeri43

Obwohl es nicht spezifisch für die Schaltfläche in der Hierarchie war, konnte ich dies einfacher visualisieren und verstehen: 

Von hier: Originalquelle

 enter image description here

ObjC:

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

Schnell:

let point = subview1.convert(subview2.frame.Origin, to: viewControll.view)
13
Vlad

Rahmen: (X, Y, Breite, Höhe). 

Daher ändern sich Breite und Höhe auch gegenüber der Super-Super-Ansicht nicht. Sie können das X, Y wie folgt erhalten.

X = button.frame.Origin.x + [button superview].frame.Origin.x;
Y = button.frame.Origin.y + [button superview].frame.Origin.y;
6
iRavi iVooda

Sie können die Super-Super-Ansicht ganz einfach wie folgt erhalten.

secondView -> [Button-Übersicht]
firstView -> [[SuperView Superschaltfläche]]

Dann können Sie die Position der Schaltfläche ermitteln.

Sie können dies verwenden:

xPosition = [[button superview] superview].frame.Origin.x;
yPosition = [[button superview] superview].frame.Origin.y;
1
said altintop

Wenn mehrere Ansichten gestapelt sind und Sie keine möglichen Ansichten zwischen den gewünschten Ansichten kennen müssen (oder möchten), können Sie Folgendes tun:

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)
}

wenn targetView der Button wäre, wäre baseView der ViewController.view .
Was diese Funktion versucht, ist Folgendes:
Wenn targetView keine Superansicht hat, wird die aktuelle Koordinate zurückgegeben.
Wenn die Super-Ansicht von targetView nicht die baseView ist (d. H. Es gibt andere Ansichten zwischen der Schaltfläche und der Ansicht viewcontroller.view), wird eine konvertierte Koordinate abgerufen und an die nächste Übersicht übergeben. 
Dasselbe geschieht weiterhin durch den Stapel von Ansichten, die sich in Richtung der Basisansicht bewegen. 
Wenn es die baseView erreicht hat, führt es eine letzte Konvertierung durch und gibt sie zurück.
Hinweis: Es behandelt keine Situation, in der sich targetView unter dem baseView befindet.

0
Rexb

UIView-Erweiterung zum Konvertieren des Frames einer Unteransicht (inspiriert von der @ Rexb-Antwort).

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)
0
boro