2009-09-23 6 views
176

La position d'un UIView peut évidemment être déterminée par view.center ou view.frame etc., mais ce ne retourne que la position de la UIView par rapport à sa superview immédiate.iPhone - Obtenez Position de UIView dans les UIWindow toute

Je dois déterminer la position du UIView dans tout le système de coordonnées 320x480. Par exemple, si le UIView est dans un UITableViewCell, sa position dans la fenêtre peut changer radicalement, indépendamment de la vue d'ensemble.

Des idées si et comment c'est possible?

cheers :)

Répondre

300

C'est facile:

[aView convertPoint:localPosition toView:nil]; 

... convertit un point dans l'espace de coordonnées local de coordonnées 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: 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. ont toujours leur origine dans le coin supérieur gauche de l'écran non pivoté.
  3. sont 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 du périphérique sont différents et ne doivent pas être confondus avec les coordonnées de la fenêtre.
+0

génial :) Je pensais que ce devrait être simple, mais j'avais le sentiment que la pomme ne le donnerait pas si facilement ... eh bien ils l'ont fait. merci –

+0

J'ai ajouté une question différente - cela a fonctionné pour moi dans le simulateur, mais pas sur le périphérique réel :( –

+0

voici l'autre question http://stackoverflow.com/q/6013766/531527 –

22

Swift:

let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil) 
19

Swift 4:

let globalPoint = aView.superview?.convert(aView.frame.origin, to: nil) 
8

Swift 3, avec l'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) 
    } 
} 
Questions connexes