iPhone: obtenga la posición de UIView dentro de toda la ventana UI


206

UIViewObviamente, la posición de a puede determinarse por view.centero view.frameetc., pero esto solo devuelve la posición de UIViewen relación con su supervista inmediata.

Necesito determinar la posición del UIViewen todo el sistema de coordenadas 320x480. Por ejemplo, si el UIViewestá en UITableViewCellsu posición dentro de la ventana podría cambiar dramáticamente independientemente de la supervista.

¿Alguna idea de si esto es posible?

Salud :)

Respuestas:


340

Esa es fácil:

[aView convertPoint:localPosition toView:nil];

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

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

Edición 2014: Mirando 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 rotar.
  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 el dispositivo son diferentes y no deben mezclarse con las coordenadas de la ventana.

increíble :) Pensé que debería ser simple, pero tuve la sensación de que Apple no lo daría tan fácil ... bueno, lo hicieron. gracias
Lior Frenkel

41
Tenga en cuenta que especificar nil en el parámetro toView le proporciona las coordenadas del dispositivo, que no serán lo que desea si no está en orientación vertical. Ver convertpointtoview-in-landscape-mode-giving-wrong-values
Matt__C

2
Este método seguía volviendo aView.frame.originpara mí. Me tomó un tiempo darme cuenta de que la supervista de mi vista no tenía una supervista en sí.
Dan Abramov

3
Si su superView no tenía una superView, su vista no debería verse en absoluto
user4951

17
Adaptando la solución vinculada @Matt__C a su caso, se convertiría en:[view.superview convertPoint:view.frame.origin toView:[UIApplication sharedApplication].keyWindow.rootViewController.view]
Ghigo

49

Swift 5, Swift 4 :

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

33

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

30

En Swift:

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

9

Aquí hay una combinación de la respuesta de @Mohsenasm y un comentario de @Chigo adoptado a Swift

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

simple y agradable!
nastassia
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.