111 votes

Obtenir la position de UIView par rapport à la superview de sa superview

J'ai un UIView, dans lequel j'ai disposé des UIButtons. Je veux trouver les positions de ces UIButtons.

Je suis conscient que buttons.frame me donnera les positions, mais il ne me donnera les positions que par rapport à sa vue supérieure immédiate.

Y a-t-il un moyen de trouver la position de ces boutons, par rapport à la vue supérieure de UIButtons ?

Par exemple, supposons qu'il existe une UIView nommée "firstView".

Ensuite, j'ai une autre UIView, "secondView". Cette "SecondView" est une sous-vue de "firstView".

Ensuite, j'ai un UIButton comme sous-vue de la "secondView".

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

Maintenant, y a-t-il un moyen de trouver la position de ce UIButton, par rapport à "firstView" ?

218voto

mprivat Points 9217

Vous pouvez utiliser ceci :

Objectif-C

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

Swift

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

Référence de la documentation :

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

56voto

Vlad Points 61

Bien qu'elle ne soit pas spécifique au bouton dans la hiérarchie comme demandé, j'ai trouvé cela plus facile à visualiser et à comprendre :

D'ici : source originale

enter image description here

ObjC :

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

Swift :

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

22voto

iajmeri43 Points 1748

Mise à jour pour Swift 3

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

        print(frame)
    }

enter image description here

13voto

boro Points 526

Extension UIView pour convertir le cadre de la sous-vue (inspiré par la réponse de @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: buttonView)

8voto

Dunes Buggy Points 1669

Cadre : (X,Y,largeur,hauteur).

La largeur et la hauteur ne changeront donc pas, même par rapport à la vue super-super. Vous pouvez facilement obtenir les valeurs X, Y comme suit.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X