2009-09-23 7 views
176

La posición de un UIView, obviamente, puede ser determinada por view.center o view.frame etc., pero esto sólo se devuelve la posición de la UIView en relación con su supervista inmediata.iPhone - Obtener la posición de UIView dentro de todo UIWindow

Necesito determinar la posición del UIView en todo el sistema de coordenadas 320x480. Por ejemplo, si el UIView está en un UITableViewCell su posición dentro de la ventana podría cambiar dramáticamente, independientemente de la supervista.

¿Alguna idea de cómo y cómo es posible?

Saludos :)

Respuesta

300

Eso es fácil:

[aView convertPoint:localPosition toView:nil]; 

... convierte en un punto de coordenadas local del espacio de coordenadas de la ventana. Puede utilizar este método para calcular el origen de una vista en el espacio ventana como esta:

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

2014 Edición: En cuanto a la popularidad del comentario de Matt__C parece razonable señalar que las coordenadas ...

  1. no cambie al girar el dispositivo.
  2. siempre tienen su origen en la esquina superior izquierda de la pantalla sin girar.
  3. son coordenadas de ventana: El sistema de coordenadas está definido por los límites de la ventana. Los sistemas de coordenadas de la pantalla y del dispositivo son diferentes y no deben mezclarse con las coordenadas de la ventana.
+0

impresionante :) pensé que debe ser simple, pero tenía la sensación de que la manzana no se lo daría tan fácil ... bueno, lo hicieron. gracias –

+0

Agregué una pregunta diferente - funcionó para mí en el simulador pero no en el dispositivo real :( –

+0

aquí está la otra pregunta http://stackoverflow.com/q/6013766/531527 –

22

En 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, con extensión:

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