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" ?

5voto

Rexb Points 445

Si plusieurs vues sont empilées et que vous n'avez pas besoin (ou ne voulez pas) connaître les vues possibles entre celles qui vous intéressent, vous pouvez procéder ainsi :

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 serait le bouton, baseView serait le ViewController.view .
Ce que cette fonction essaie de faire est le suivant :
Si targetView n'a pas de super vue, sa coordonnée actuelle est retournée.
Si targetView's La super-vue n'est pas la baseView (c'est-à-dire qu'il y a d'autres vues entre le bouton et l'écran de l'utilisateur). viewcontroller.view ), une coordonnée convertie est récupérée et transmise à la fonction suivante superview .
Il continue à faire de même à travers la pile de vues en se déplaçant vers la baseView.
Une fois qu'il a atteint le baseView il effectue une dernière conversion et le renvoie.
Note : cela ne gère pas une situation où targetView est positionné sous le baseView .

3voto

said altintop Points 1

Vous pouvez facilement obtenir la vue super-super comme suit.

secondView -> [bouton supervisé]
firstView -> [[bouton supervisé] supervisé]

Ensuite, vous pouvez obtenir la position du bouton

Vous pouvez utiliser ceci :

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

2voto

fs_tigre Points 845

Veuillez noter que le code suivant fonctionne quelle que soit la profondeur (imbriquée) de la vue pour laquelle vous avez besoin de l'emplacement dans la hiérarchie des vues.

Supposons que vous ayez besoin de l'emplacement de myView qui se trouve à l'intérieur myViewsContainer et qui est vraiment profond dans la hiérarchie des vues, il suffit de suivre la séquence suivante.

let myViewLocation = myViewsContainer.convert(myView.center, to: self.view)
  • myViewsContainer : le conteneur de vue où se trouve la vue pour laquelle vous avez besoin de l'emplacement.

  • myView : la vue pour laquelle vous avez besoin de l'emplacement.

  • self.view la vue principale

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