2010-08-01 10 views
9

Ho usato questo tipo di metodi, ma non ho mai veramente capito come si sono comportati.Come funziona - (CGRect) convertRect: (CGRect) rect toView: (UIView *) visualizza il lavoro

Ogni volta che tento di usarli, mi ritrovo frugare nel buio mentre cerco aspetto diverso e non è mai sembra di fare quello che mi aspettavo che.

Per ragioni, sto provando a convertire il frame che ottengo dalla notifica di UIKeyboard.

In modalità orizzontale, ottengo questo NSRect:

UIKeyboardFrameEndUserInfoKey = NSRect: {{406, 0}, {362, 1024}} 

Ora voglio convertirlo al corretto rect (swap x/y, larghezza e altezza) così faccio

CGRect compatibleRect = [self convertRect:[[[notif userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] toView:nil]; 

ma il rettangolo diventa:

compatibleRect = CGRect: {{406,406}, {362, 1024}} 

Qualsiasi aiuto sarebbe apprezzato :)

risposta

13

Si sta usando male. Fondamentalmente fa una conversione di coordinate. Suppongo che inizi a convertire il rect dalla vista di partenza alle coordinate della finestra e quindi riconvertire dalle coordinate della finestra al sistema di coordinate della seconda vista. Ecco un esempio.

Hai due subviews nella vostra finestra, uno con una cornice di {{25,0}, {100, 100}}, l'altra con una cornice di {{50, 50}, {200, 200}} Vuoi tradurre il seguente rect {{50, 50}, {50, 50}} dalla prima sottoview alla seconda sottoview. Ecco come potrebbe funzionare.

  1. convertire il rect dalla prima visualizzazione secondaria di coordinate per la finestra coordinate: Dal momento che la visualizzazione secondaria stiamo iniziando dalla sua origine è di 25,0 {} abbiamo bisogno di tradurlo alle coordinate finestra. Questo può essere fatto aggiungendo l'origine della sottoview all'origine del rect, quindi il nuovo rect nelle coordinate della finestra è {{75, 50}, {50, 50}}

  2. convertire il nuovo retto dalla finestra coordina le coordinate della seconda subview: Iniziamo con il rect {{75, 50}, {50, 50}}, Il frame della seconda sottoview è {{50, 50}, {200, 200}}. Ora sottraiamo l'origine della seconda sottoview al rect per fare la nostra traduzione. Così si finisce con un rettangolo tradotto di {{25, 0}, {50, 50}}

+2

capisco come funzionano le conversioni. Tuttavia, sto cercando di capire come funziona quel metodo specifico. Ho usato [self.window convertRect: [[[notif userInfo] objectForKey: UIKeyboardFrameEndUserInfoKey] CGRectValue] fromWindow: nil]; per farlo funzionare. Se si verifica il seguente link http://developer.apple.com/iphone/library/documentation/uikit/reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html#//apple_ref/occ/instm/UIWindow/convertRect:fromWindow : Si indica come si comporta, ma non è molto chiaro su cosa stia realmente succedendo –

+4

Nel tuo caso vuoi usare convertRect: fromView: not convertRect: toView: così [self convertRect: rect fromView: nil] prenderà i limiti , cioè nelle coordinate dello schermo e convertirlo nelle coordinate della vista locale. – Elfred

Problemi correlati