2013-04-16 14 views
7

Qual è il modo migliore per normalizzare i valori CGRect in modo che siano compresi tra 0 e 1 (sistema di coordinate dell'unità)?Normalizzazione CGRect tra 0 e 1

+0

@CodaFi Questo è niente a che fare con CGRectIntegral. Si tratta di convertire in un sistema di coordinate "unità" per lavorare con vari metodi CALayer. –

+0

Per qualsiasi recensore o mod, entrambi i voti ravvicinati sono totalmente non validi. –

+0

Lo sono. Non ho letto abbastanza la domanda. Non sono sicuro degli altri, però. – CodaFi

risposta

14

Un modo molto conciso di fare questo sarebbe:

CGAffineTransform t = CGAffineTransformMakeScale(1.0/parentRect.size.width, 1.0/parentRect.size.height); 
CGRect unitRect = CGRectApplyAffineTransform(rect, t); 
+0

Questa risposta sembra funzionare molto bene il problema. – ORStudios

9

Questo dovrebbe fare il trucco. Hai solo bisogno di dividere tutto per la larghezza/altezza della vista genitore o del livello.

CGFloat parentWidth = parentView.bounds.size.width; 
CGFloat parentHeight = parentView.bounds.size.height; 

CGRect rectToConvert = ...; 

rectToConvert.origin.x /= parentWidth; 
rectToConvert.origin.y /= parentHeight; 
rectToConvert.size.width /= parentWidth; 
rectToConvert.size.height /= parentHeight; 

Diciamo questi tipi di rettangoli e punti si trovano nella "unità di sistema di coordinate". Puoi leggere ulteriori informazioni a riguardo nello Core Animation Programming Guide.

+0

Perché stai dividendo le coordinate di origine per la dimensione? –

+0

@SeamusCampbell Forse perché è necessario? –

+0

Così facendo restituirai un 'CGFloat' tra 0 e 1 - che è quello che l'utente ha chiesto .. – rog

0

ne dite di questo:

CGRect rectToConvert; 
NSAffineTransform *n = [NSAffineTransform transform]; 
[n scaleXBy:rectToConvert.size.width 
     yBy:rectToConvert.size.height]; 
[n invert]; 

CGRect normalizedRect; 
normalizedRect.origin = [n transformPoint:rectToConvert.origin]; 
normalizedRect.size = [n transformSize: rectToConvert.size]; 

CGPoint anyPointINeedToConvert; 
CGPoint convertedPoint = [n transformPoint:anyPointINeedToConvert]; 

I pensa questo lo rende un po 'più chiaro quello che sta succedendo e ti permette di prendersi cura di traduzioni in modo evidente, se si ha a che fare di loro.