Animar un UIImageView desde el centro de UIImageView

Tengo un UIImageView que debería animarse desde el size (0,0) --> (93,75)

Tengo el siguiente

  [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{ imgButton.layer.anchorPoint = CGPointMake(imgButton.bounds.size.width/2, imgButton.bounds.size.height/2); CGRect btnFrame = imgButton.frame; btnFrame.size.width = 105; btnFrame.size.height = 85; imgButton.frame = btnFrame; } completion:^(BOOL finished) { [self animageButton2:imgButton]; }]; 

Esto funciona, pero el único problema que tengo es que no se está animando desde el centro de UIImageView sino desde la esquina superior izquierda.

¿Alguien tiene una pista?

Lo he resuelto con la ayuda de Borrden. Esta es mi solución.

Primero crea una vista de image

 UIImageView *imgLineup = [[UIImageView alloc]initWithFrame:CGRectMake(10, y, 93, 75)]; imgLineup.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.0, 0.0); 

Y luego a lo siguiente.

 [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ imgButton.layer.anchorPoint = CGPointMake(0.5, 0.5); imgButton.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0); } completion:^(BOOL finished) { NSLog(@"done"); }]; 

Solo testing con esto. import #import <QuartzCore/QuartzCore.h> luego coloque el código debajo mientras agrega uimageView en subView de self.view

 CABasicAnimation *zoomAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; [zoomAnimation setDuration:0.8]; [zoomAnimation setRepeatCount:1]; [zoomAnimation setFromValue:[NSNumber numberWithFloat:0.1]]; [zoomAnimation setToValue:[NSNumber numberWithFloat:1.0]]; [zoomAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [[imageView layer] addAnimation:zoomAnimation forKey:@"zoom"]; 

Lo que sugiero puede ser una especie de pirateo, pero será una manera más fácil de lograr lo que quieres:

  • Establece el marco inicial de imageView como:

     CGRectMake(center, center, 0, 0); 

    Entonces en su caso será algo más cercano a:

     CGRectMake(46, 37, 0, 0); 
  • Entonces animalo con un nuevo rect de algo como esto:

     CGRectMake(0, 0,93,75); 

    Puede usar UIViewAnimation simple para esto;

      [UIView beginAnimations:@"zoom" context:NULL]; [UIView setAnimationDuration:0.3]; imageView.frame = CGRectMake(0, 0, 93, 75); ; [UIView commitAnimations]; 

Espero que funcione

Lo que está tratando de lograr es una transformación de escala, es decir, animando el tamaño de UIView desde el tamaño (0,0) hasta el tamaño (w, h). El mismo efecto se puede lograr con CGAffineTransformMakeScale .

Inicialmente cuando crea la vista, aplique CGAffineTransformMakeScale(0.0,0.0) luego CGAffineTransformMakeScale(0.0,0.0) escala de tamaño hasta CGAffineTransformMakeScale(1.0,1.0) .

Código:

 // Create the view and apply correct frame UIView *tagView = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 100, 100)]; tagView.tag = kTag; //Apply scale transform, to make size(0,0) tagView.transform = CGAffineTransformMakeScale(0,0); [self.view addSubview:tagView]; /// ............ UIView *tagView = [self.view viewWithTag:kTag]; //Now animate the view size scale up [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ tagView.transform = CGAffineTransformMakeScale(1.0,1.0); } completion:NULL ]; 

Esta animation ocurrirá sobre el punto central de la vista como desee, evitando así la necesidad de jugar con anchorPoint y frame , lo que puede ser complicado. Lea más sobre la relación entre frame y anchorPoint de esta respuesta .