2012-01-06 18 views
23

Si entiendo correctamente escalar un UIView con CGAffineTransform, ancla la transformación a su centro.Escala con CGAffineTransform y establece el ancla

En particular:

self.frame = CGRectMake(0,0,100,100); 
self.transform = CGAffineTransformMakeScale(2, 2); 
NSLog(@"%f;%f;%f;%f", self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height); 

Lienzo:

-50;-50;200;200 

¿Cómo se crea una escala CGAffineTransform que utiliza un punto de anclaje específico (por ejemplo 0; 0)?

+13

Es raro, estoy en iOS 7 y no escala del centro, pero a partir de escalas la parte superior izquierda ... Incluso si ajusto el punto de anclaje a (0.5, 0.5), no se escalará desde el centro. Alguien tiene una idea? –

+2

@VanDuTran Encontré que el uso de 'CATransform3D' en la' capa' de la vista se comporta correctamente y obedece a 'anchorPoint'. Pruébelo en lugar de usar 'CGAffineTransformMakeScale', que de alguna manera restringe la vista a los límites superior e izquierdo de la ventana. –

+0

@JonathanLin Uso capa con CATransform3D que también sin suerte en iOS 7 – ZYiOS

Respuesta

57

(a)

Escala y luego traducir?

Algo así como:

CGAffineTransform t = CGAffineTransformMakeScale(2, 2); 
t = CGAffineTransformTranslate(t, width/2, height/2); 
self.transform = t; 

(b)

Establecer el punto de anclaje (que es probablemente lo que quiere realmente)

[self layer].anchorPoint = CGPointMake(0.0f, 0.0f); 
self.transform = CGAffineTransformMakeScale(2, 2); 

(c)

Ajuste el centro de nuevo para asegurarse de que está en el mismo lugar?

CGPoint center = self.center; 
self.transform = CGAffineTransformMakeScale(2, 2); 
self.center = center; 
+0

El método (a) imprime 50; 50; 200; 200 con una escala de 2. Probará el método (b) en breve, pero no afectaría a todos transforma? Puede causar efectos secundarios. – hpique

+0

Eso es porque la primera transformación de escala afectará a la segunda. El orden que aplica transforma las cosas;) ¿Y si solo está tratando de hacer una traducción, entonces no solo establece el marco/límites/centro en la nueva posición? – deanWombourne

+0

Curiosamente, el método (a) imprime 0; 0; 300; 300 con una escala de 3 y --50; -50; 400; 400 con una escala de 4. ¿Tal vez falta algo? – hpique

2

En primer lugar import <QuartzCore/QuartzCore.h> a continuación, establecer los puntos de anclaje de la vista:

[[self layer] setAnchorPoint:CGPointMake(0, 0)]; 
+1

Eso cambiaría el punto de anclaje para todas las transformaciones. Me gustaría crear una transformación de escala con un punto de anclaje específico. – hpique

+0

CGAffineTransform tr = CGAffineTransformScale (self.transform, 2, 2); self.transform = tr; self.center = CGPointMake (0,0); –

Cuestiones relacionadas