web-dev-qa-db-fra.com

iPhone - Obtenir la position d'UIView dans l'ensemble de UIWindow

La position d'un UIView peut évidemment être déterminée par view.center ou view.frame etc. mais cela ne retourne que la position de UIView par rapport à sa superview immédiate.

Je dois déterminer la position du UIView dans l’ensemble du système de coordonnées 320x480. Par exemple, si le UIView se trouve dans un UITableViewCell, sa position dans la fenêtre pourrait changer de façon spectaculaire, indépendamment de la vue d'ensemble.

Des idées si et comment cela est possible?

À votre santé :)

196
adam

C'est facile:

[aView convertPoint:localPosition toView:nil];

... convertit un point de l'espace de coordonnées local en coordonnées de fenêtre. Vous pouvez utiliser cette méthode pour calculer l'origine d'une vue dans l'espace de la fenêtre comme ceci:

[aView.superview convertPoint:aView.frame.Origin toView:nil];

2014 Edit: En regardant la popularité du commentaire de Matt__C, il semble raisonnable de souligner que les coordonnées ...

  1. ne change pas lors de la rotation de l'appareil.
  2. toujours avoir leur origine dans le coin supérieur gauche de l'écran sans rotation.
  3. are coordonnées de la fenêtre: Le système de coordonnées est défini par les limites de la fenêtre. Les systèmes de coordonnées de l'écran et de l'appareil sont différents et ne doivent pas être mélangés avec les coordonnées de la fenêtre.
327
Nikolai Ruhe

Swift 4:

let globalPoint = aView.superview?.convert(aView.frame.Origin, to: nil)
40
Yuchen Zhong

En rapide:

let globalPoint = aView.superview?.convertPoint(aView.frame.Origin, toView: nil)
28
Shlomi Schwartz

Swift 3, avec extension:

extension UIView{
    var globalPoint :CGPoint? {
        return self.superview?.convert(self.frame.Origin, to: nil)
    }

    var globalFrame :CGRect? {
        return self.superview?.convert(self.frame, to: nil)
    }
}
25
Mohsenasm

Voici une combinaison de la réponse de @Mohsenasm et d'un commentaire de @Chigo adopté par Swift

extension UIView {
    var globalFrame: CGRect? {
        let rootView = UIApplication.shared.keyWindow?.rootViewController?.view
        return self.superview?.convert(self.frame, to: rootView)
    }
}
0
Vlad Spreys