iPhone: ottieni la posizione di UIView nell'intera UIWindow


206

La posizione di a UIView può ovviamente essere determinata da view.centero view.frameecc., Ma ciò restituisce solo la posizione di UIViewin relazione alla sua superview immediata.

Devo determinare la posizione di UIView dell'intero sistema di coordinate 320x480. Ad esempio, se la UIViewsi trova in una UITableViewCellposizione che è all'interno della finestra potrebbe cambiare drasticamente Indipendentemente dal superview.

Qualche idea se e come sia possibile?

Saluti :)

Risposte:


340

È facile:

[aView convertPoint:localPosition toView:nil];

... converte un punto nello spazio di coordinate locale in coordinate della finestra. È possibile utilizzare questo metodo per calcolare l'origine di una vista nello spazio della finestra in questo modo:

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

Modifica 2014: guardando la popolarità del commento di Matt__C sembra ragionevole sottolineare 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 le 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.

fantastico :) Ho pensato che dovrebbe essere semplice, ma ho avuto la sensazione che Apple non lo avrebbe dato così facilmente ... bene l'hanno fatto. grazie
Lior Frenkel

41
Tenere presente che se si specifica zero nel parametro toView si ottengono le coordinate del dispositivo, che non sarà ciò che si desidera se non si è in orientamento verticale. Vedi convertpointtoview-in-landscape-mode-giving-wrong-valori
Matt__C

2
Questo metodo ha continuato a tornare aView.frame.originper me. Mi ci è voluto un po 'per capire che la superview della mia vista non aveva una superview stessa.
Dan Abramov,

3
Se il tuo superView non aveva un superView, la tua vista non dovrebbe essere vista affatto
user4951

17
Adattando la soluzione collegata @Matt__C al tuo caso, diventerebbe:[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 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)
    }
}

30

In Swift:

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

9

Ecco una combinazione della risposta di @Mohsenasm e un commento di @Chigo adottato da Swift

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

semplice e carino!
nastassia,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.