2010-10-15 15 views
12

Tengo una UIView que configuré para responder a los gestos de pellizco y cambiar su tamaño, excepto que, una vez que la agranda y luego intenta pellizcarla nuevamente, salta a su tamaño original (que resulta ser 100x200). Aquí está el código:CGAffineTransformMakeScale hace que UIView salte al tamaño del original antes de la escala

@implementation ChartAxisView 


- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     // do gesture recognizers 
     UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(onPinch:)]; 
     [self addGestureRecognizer:pinch]; 
     [pinch release]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGColorRef redColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0].CGColor; 

    CGContextSetFillColorWithColor(context, redColor); 
    CGContextFillRect(context, self.bounds); 
} 

- (void)onPinch: (UIPinchGestureRecognizer*) gesture { 
    self.transform = CGAffineTransformMakeScale(gesture.scale, gesture.scale); 
} 

- (void)dealloc { 
    [super dealloc]; 
} 


@end 

¿Alguna idea?

Respuesta

26

Así que hay dos tipos de escala (o, en general) transformar funciones: CGAffineTransformMakeScale y CGAffineTransformScale

La primera de ellas, CGAffineTransformMakeScale la que está utilizando, transforma siempre en relación con el tamaño original de la imagen. Y es por eso que ve el salto a su tamaño original antes de que ocurra la escala.

El segundo, CGAffineTransformScale, se transforma desde la posición actual de la imagen. Esto es lo que necesitas. Para esto, requiere una arg "transformar" adicional. La 'transformación' arg en su caso representa la imagen ampliada.

Lea this publicación del blog muy informativa sobre las transformaciones.

+0

Además, el tamaño automáticamente hará que las restricciones a interferir con la posición, incluso si se usa 'CAAffineTransformScale'. –

2
- (void)onPinch: (UIPinchGestureRecognizer*) gesture { 

    if ([gesture state] == UIGestureRecognizerStateBegan) 
    { 
    curTransform = self.transform; 
    } 

    self.transform = CGAffineTransformScale(curTransform,gesture.scale, gesture.scale); 
} 
  • uso CGAffineTransformScale en lugar de CGAffineTransformMakeScale
  • necesitará un miembro de -> CGAffineTransform curTransform;

;)

2

puede establecer transformar con siguiente código:

ivClone setTransform:CGAffineTransformMakeScale(scale, scale)]; 

y se puede obtener transformación actual con el siguiente COEE:

newV.transform.a //x scale 
newV.transform.d // y scale 
Cuestiones relacionadas