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

Adán
fuente

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.
Nikolai Ruhe
fuente
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)
Yuchen Zhong
fuente
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)
    }
}
Mohsenasm
fuente
30

En Swift:

let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil)
Shlomi Schwartz
fuente
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)
    }
}
Vlad Spreys
fuente
simple y agradable!
nastassia