2011-07-27 12 views
5

Estoy tratando de deslizar hacia abajo una imagen en un UIImageView, pero no sé qué combinación de UIContentMode y la propiedad de animación es la correcta para que eso suceda. La imagen siempre debe tener el mismo tamaño y no debe estirarse ... todo lo que quiero es que primero no haya nada visible y que el marco se extienda y revele la imagen.Animación de UIView para deslizar hacia abajo

Tal vez sea más fácil si se entiende lo que quiero decir:

Illustration of my Problem

Por lo tanto, parece bastante fácil, pero lo UIContentMode debo usar para el UIImageView y lo que la propiedad debería animar? ¡Gracias!

+0

¿Cómo puedo mantener la animación agregada después de que se muestre en lugar de repetirla? Gracias. –

Respuesta

8

Me hice cargo e hice un screencast también. Was this what you had in mind?

Pongo la animación repitiéndose indefinidamente para que sea más fácil de capturar con un video, pero se puede iniciar presionando un botón, y congelada en su lugar, mostrando el popover y su contenido, hasta que se invierte estar escondido de nuevo

Utilicé Core Animation para eso, en lugar de animar un UIView, ya que quería usar la propiedad mask de CALayer para ocultar el popover y revelarlo con una animación deslizante.

Aquí está el código que utilicé (igual que en el video):

- (void)viewDidLoad 
{ 

    // Declaring the popover layer 
    CALayer *popover = [CALayer layer]; 

    CGFloat popoverHeight = 64.0f; 
    CGFloat popoverWidth = 200.0f; 

    popover.frame = CGRectMake(50.0f, 100.0f, popoverWidth, popoverHeight); 
    popover.contents = (id) [UIImage imageNamed:@"popover.png"].CGImage; 

    // Declaring the mask layer 
    CALayer *maskLayer = [CALayer layer]; 
    maskLayer.frame = CGRectMake(0, - popoverHeight, popoverWidth, popoverHeight); 
    maskLayer.backgroundColor = [UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1.0f].CGColor; 

    // Setting the animation (animates the mask layer) 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position.y"]; 
    animation.byValue = [NSNumber numberWithFloat:popoverHeight]; 
    animation.repeatCount = HUGE_VALF; 
    animation.duration = 2.0f; 

    [maskLayer addAnimation:animation forKey:@"position.y"]; 

    //Assigning the animated maskLayer to the mask property of your popover 
    popover.mask = maskLayer; 

    [self.view.layer addSublayer:popover]; 

    [super viewDidLoad]; 
} 

NOTA: Usted tiene que importar el marco QuartzCore en su proyecto y escribir esta línea en su archivo de cabecera: #import <QuartzCore/QuartzCore.h>.

Indica si esto funciona para usted o si necesita más ayuda para configurarlo.

+0

guau, ¡muchas gracias por tu respuesta tan detallada! Nunca me metí con CALayer antes, pero el código que proporcionaste es exactamente lo que necesito. Voy a jugar con eso. – denbec

2

Pruebe este código. Considere el UIImageView como imageView.

imageView.contentMode = UIViewContentModeScaleAspectFill; 
CGRect imageRect = imageView.frame; 
CGRect origImgRect = imageRect; 
imageRect.size.height = 5; 
imageView.frame = imageRect; 

[UIView animateWithDuration:2.0 
    animations:^{imageView.rect = origImgRect;} 
    completion:^(BOOL finished){ }]; 
+0

Oye, supongo que te referías a imageView.frame, not .rect, ¿no? Y lo que está pasando entonces se puede ver [aquí] (http://screencast.com/t/e98VLE3if). Pero eso solo mueve toda la vista hacia abajo, solo quiero que la imagen permanezca en su lugar, pero mueva hacia abajo en el área visible ... – denbec

+0

Sí, es marco. En realidad, lo que estoy haciendo es primero establecer el alto del marco de la vista de la imagen en 5 para que se vea solo la flecha. Luego, estoy configurando la altura real con animación. Supongo que puedes depurar fácilmente las cosas aquí. – Ilanchezhian

+0

¿has verificado el video que he vinculado en el comentario anterior? verás que toda la vista se mueve, no el recorte, con tu código ... – denbec

Cuestiones relacionadas