2009-09-23 8 views
176

La posizione di un UIView può ovviamente essere determinato da view.center o view.frame ecc, ma questo restituisce solo la posizione del UIView in relazione alla sua superview immediato.iPhone - Get Posizione del UIView all'interno dell'intero UIWindow

Devo determinare la posizione dello UIView nell'intero sistema di coordinate 320x480. Ad esempio, se UIView si trova in una posizione UITableViewCell, la posizione all'interno della finestra potrebbe cambiare drasticamente in modo irregolare rispetto alla panoramica.

Qualche idea se e come è possibile?

Acclamazioni :)

risposta

300

Questo è un compito facile:

[aView convertPoint:localPosition toView:nil]; 

... converte un punto nello spazio di coordinate locali alle coordinate finestra. È possibile utilizzare questo metodo per calcolare l'origine di una vista nello spazio finestra come questa:

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

2014 Edit: Guardando la popolarità del commento di Matt__C sembra ragionevole far notare che le coordinate ...

  1. non cambiare quando si ruota il dispositivo.
  2. hanno sempre la loro origine nell'angolo in alto a sinistra dello schermo non ruotato.
  3. sono coordinate della finestra: il sistema di coordinate è definito dai limiti della finestra. I sistemi di coordinate dello schermo e del dispositivo sono diversi e non devono essere confusi con le coordinate della finestra.
+0

impressionante :) ho pensato che dovrebbe essere semplice, ma ho avuto la sensazione che la mela non glielo avrebbe dato così facilmente ... beh, l'hanno fatto. grazie –

+0

Ho aggiunto una domanda diversa - ha funzionato per me in simulatore ma non sul dispositivo reale :( –

+0

ecco l'altra domanda http://stackoverflow.com/q/6013766/531527 –

22

In 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 l'estensione:

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