Anime un UIButton en su lugar desde fuera de la pantalla cuando se carga la aplicación

Tengo algunos problemas con algunas animaciones en una aplicación para iPad. Tengo cuatro UIButtons que están en la pantalla cuando se inicia la aplicación.

Básicamente, quiero que la aplicación se cargue y que los cuatro botones se animen a la vista uno a la vez desde la parte superior de la pantalla hasta su lugar.

Tengo lo siguiente que lo anima, pero estoy luchando con eso.

-(void)viewWillAppear:(BOOL)animated
{
    CGPoint newLeftCenter = CGPointMake( 15.0f + myCocoButton.frame.size.width / 2.0f, myCocoButton.center.y);
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:4.0f];
    myCocoButton.center = newLeftCenter;
    [UIView commitAnimations];

}

El código actual que tengo anima el botón pero no de la forma que yo quiero. No puedo entender cómo colocarlo exactamente donde lo quiero.

preguntado el 03 de mayo de 12 a las 22:05

¿Qué tiene de malo el código que tienes ahora? -

No hace exactamente lo que quiero. Tengo que colocar el botón fuera de la vista en IB y no puedo entender cómo colocarlo exactamente donde lo quiero:

3 Respuestas

En su guión gráfico, coloque sus botones en sus posiciones finales.

In viewWillAppear:, guarda la ubicación de cada botón y mueve el botón fuera de la pantalla:

@implementation MyViewController {
    CGPoint _button0TrueCenter;
    CGPoint _button1TrueCenter;
    CGPoint _button2TrueCenter;
    CGPoint _button3TrueCenter;
}

static void moveButtonAndSaveCenter(UIButton *button, CGPoint offscreenCenter, CGPoint *trueCenter) {
    *trueCenter = button.center;
    button.center = offscreenCenter;
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if (animated) {
        moveButtonAndSaveCenter(self.button0, CGPointMake(-100, 100), &_button0TrueCenter);
        moveButtonAndSaveCenter(self.button1, CGPointMake(420, 100), &_button1TrueCenter);
        moveButtonAndSaveCenter(self.button2, CGPointMake(-100, 200), &_button2TrueCenter);
        moveButtonAndSaveCenter(self.button3, CGPointMake(420, 200), &_button3TrueCenter);
    }
}

Entonces en viewDidAppear:, anímelos de vuelta a sus ubicaciones originales:

static void animateButton(UIButton *button, CGPoint newCenter, NSTimeInterval delay) {
    [UIView animateWithDuration:.25 delay:delay options:0 animations:^{
        button.center = newCenter;
    } completion:nil];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (animated) {
        animateButton(self.button0, _button0TrueCenter, 0);
        animateButton(self.button1, _button1TrueCenter, 0.2);
        animateButton(self.button2, _button2TrueCenter, 0.4);
        animateButton(self.button3, _button3TrueCenter, 0.6);
    }
}

contestado el 03 de mayo de 12 a las 22:05

hhhmm, implementé todo eso, pero cuando la aplicación carga, el botón permanece exactamente en el mismo lugar en el que se colocó originalmente a través del Storyboard. - Paul Morris

Suponiendo que tiene sus botones en una matriz, podría hacer algo como esto (sus elementos deben estar en las posiciones finales correctas en la punta)

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    CGAffineTransform transform = CGAffineTransformMakeTranslation(0.f, -200.f); 

    [self.buttons enumerateObjectsUsingBlock:^(UIButton *button, NSUInteger idx, BOOL *stop) {

       button.transform = transform; // This translates the view's off the top of the screen

       [UIView animateWithDuration:0.25f
                             delay:0.25f * idx
                           options:UIViewAnimationCurveEaseOut            // No point doing easeIn as the objects are offscreen anyway
                        animations:^{
                            button.transform = CGAffineTransformIdentity;
                      } completion:nil];

       }];
}

Esto animará cada vez. Es posible que deba agregar un ivar para evitar que esto suceda y simplemente configurarlo en SÍ después de que esto se haya ejecutado una vez. El problema que encontré cuando estaba jugando es que cuando estaba llamando viewDidAppear: animated fue NO en la primera carga, por lo que no pude usar ese BOOL como control

contestado el 04 de mayo de 12 a las 00:05

He escrito una publicación de blog sobre este tema: http://www.roostersoftstudios.com/2011/07/01/iphone-dev-performing-sequential-uiview-animations/

y tengo un proyecto de muestra allí.

Simplemente puede encadenar las animaciones donde, cuando una termina, llama a la función de la siguiente animación. ¿Puede ser más específico sobre los problemas exactos que está teniendo?

contestado el 03 de mayo de 12 a las 22:05

El problema que tengo es que no puedo hacer que el botón descanse finalmente donde quiero en la pantalla. Además, tengo que configurar el botón en IB fuera de la pantalla para que se vea. Estoy seguro de que debe haber una forma "adecuada" de hacerlo. Leeré tu enlace. - Paul Morris

La forma en que me gusta configurar algo fuera de la pantalla es en código para que no tenga que administrar un archivo IB desordenado. Así que simplemente mantenga el botón fuera de la vista si lo desea y luego en su "viewDidLoad" puede hacer algo como: - rooster117

[self.view addSubView: suboton]; subotón.marco = CGRectMake(100, -100, subotón.marco.tamaño.ancho, subotón.marco.tamaño.alto); - rooster117

También recomendaría manipular el marco de su botón en lugar del centro. Esta es solo mi preferencia, pero me resulta más fácil tratar con la esquina superior izquierda del botón cuando se trata de valores absolutos. - rooster117

Sí, estoy de acuerdo con eso. Alguien mencionó usar el centro, por eso lo estaba usando de esa manera. Sin embargo, la parte superior izquierda es más fácil de manejar para mi pequeño cerebro. - Paul Morris

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.