Estoy trabajando en UIButton animación donde:

La UIButton está situado en el centro de la parte inferior de la pantalla y la escala a un tamaño pequeño

_menuBtn.transform = CGAffineTransformMakeScale(0.1f, 0.1f);

Cuando se inicia la aplicación se debe pasar a la parte inferior izquierda de la pantalla como escalas o crecer a su tamaño original.

- (void)viewDidLoad
{
    [super viewDidLoad];

    _menuBtn.frame = CGRectMake(160, 513, 30, 30); 
    _menuBtn.superview.frame = CGRectMake(160, 513, 30, 30);

    _menuBtn.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
    NSLog(@"_menuBtn: %@ ; _menuBtn.superview: %@", _menuBtn, _menuBtn.superview);
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    CGAffineTransform scaleTrans  = CGAffineTransformMakeScale(1.0f, 1.0f);
    CGAffineTransform lefttorightTrans  = CGAffineTransformMakeTranslation(-200.0f,0.0f);
    _menuBtn.transform = CGAffineTransformConcat(scaleTrans, lefttorightTrans);
    [UIView commitAnimations];

}

problema

Cuando la animación se inicia el botón comienza a moverse desde el lado inferior derecho de la pantalla y no en el centro de la parte inferior donde es y debe ser. Alguna ayuda ?

Registro De Resultado

NSLog(@"%@", _myBtn);

2013-08-14 09:22:38.913 GJCoolNavi[339:c07] <UIButton: 0x813ea30; frame = (0 0; 0 0); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x813eaf0>>

eso es antes de hacer la animación…y el resultado después de la animación es:

2013-08-14 09:30:25.719 GJCoolNavi[612:c07] <UIButton: 0x71206d0; frame = (160 294; 0 0); opaque = NO; autoresize = TM+BM; animations = { transform=<CABasicAnimation: 0x7536a80>; position=<CABasicAnimation: 0x7537dd0>; }; layer = <CALayer: 0x7120790>>
mi primer pensamiento podría ser irrelevante para el tema, pero ¿por qué no has utilizado basado en bloques de la animación como el Apple recomienda en iOS4 o por encima?
Lo primero que pensé demasiado. Es en mi respuesta, al parecer todavía no funciona. Todavía tratando de averiguar lo que está sucediendo y por qué.

OriginalEl autor Jrey Quiros | 2013-08-13

4 Comentarios

  1. 25

    ¿Por qué no haces esto…

    _menuBtn.transform = CGAffineTransformMakeScale(0.1, 0.1);
    
    [UIView animateWithDuration:5.0
    options:UIViewAnimationOptionCurveEaseOut
    animations:^(){
        _menuBtn.transform = CGAffineTransformMakeScale(1.0, 1.0);
        _menuBtn.center = self.view.center;
    }
    completion:nil];

    Me gustaría evitar el movimiento de cosas a través de una transformación. Cambiar el marco en su lugar.

    EDITAR

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
    
        //for convenience I'm pulling these values out in to variables.
        float buttonWidth = _menuBtn.frame.size.width;
        float buttonHeight = _menuBtn.frame.size.height;
        float viewWidth = self.view.frame.size.width;
        float viewHeight = self.view.frame.size.height;
    
        //set the button frame to be the bottom center
        //note you shouldn't have to do this as Interface Builder should already place it there.
        //place the button in the horizontal center and 20 points from the bottom of the view.
        _menuBtn.frame = CGRectMake((viewWidth - buttonWidth) * 0.5, viewHeight - buttonHeight - 20, buttonWidth, buttonHeight);
    
        //scale the button down before the animation...
        _menuBtn.transform = CGAffineTransformMakeScale(0.1, 0.1);
    
        //now animate the view...
        [UIView animateWithDuration:5.0
                              delay:0.0
                            options:UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             _menuBtn.transform = CGAffineTransformIdentity;
                             _menuBtn.frame = CGRectMake(viewWidth - buttonWidth - 20, viewHeight - buttonHeight - 20, buttonWidth, buttonHeight);
                         }
                         completion:nil];
    }

    Probar esto y me dejó saber lo que sucede.

    He probado el código, pero lo que hace es que se inicia desde la parte superior izquierda de la pantalla hacia el centro de la parte inferior de la pantalla. lo que mi código suponga que hacer es que él debe moverse desde el centro de la parte inferior hacia la parte inferior izquierda de la pantalla.
    lo que está mal con el uso de transformar ?
    he creado el botón en el guión gráfico. y la colocó en el centro de la parte inferior de la pantalla
    Nada, si se utilizan correctamente. Pero las cosas se complican (caso en el punto), especialmente cuando se solicita el botón donde está. En realidad… por favor imprima el marco del botón antes de la animación.
    y eso es todo..es debido al uso de auto diseño…muchas gracias por la ayuda Fogmeister

    OriginalEl autor Fogmeister

  2. 7

    Esto se ha resuelto un problema similar.

    Aplicar una (UIButton).imageView Animación.

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    CGAffineTransform scaleTrans  = CGAffineTransformMakeScale(1.0f, 1.0f);
    CGAffineTransform lefttorightTrans  = CGAffineTransformMakeTranslation(-200.0f,0.0f);
    _menuBtn.imageView.transform = CGAffineTransformConcat(scaleTrans, lefttorightTrans);
    [UIView commitAnimations];
    GRACIAS!!! Esta es la única solución que funcionó para mí, y funcionando a la PERFECCIÓN!!!

    OriginalEl autor SaintHawk

  3. 2

    Este fenómeno indica que el botón del cuadro original está mal, probablemente debido a su auto-cambio de tamaño. Pruebe a establecer su marco para el centro de la parte inferior antes de iniciar la animación.

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        _menuBtn.superview.frame = CGRectMake(0, 513, 320, 30); //This is a quick and dirty solution to make sure your button's superview is in the right place. You probably don't want to do this and are more likely to review your view hierarchy.
        _menuBtn.frame = CGRectMake(145, 0, 30, 30); //Set the frame to the bottom center, please ensure that _menuBtn's transform hasn't been changed before this step
        _menuBtn.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:5];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
        CGAffineTransform scaleTrans  = CGAffineTransformMakeScale(1.0f, 1.0f);
        CGAffineTransform lefttorightTrans  = CGAffineTransformMakeTranslation(-200.0f,0.0f);
        _menuBtn.transform = CGAffineTransformConcat(scaleTrans, lefttorightTrans);
        [UIView commitAnimations];
    }
    puedo seguir lo que te he propuesto, estableciendo su marco para el centro de la parte inferior..pero aún cuando la aplicación de CGAffineTransformMakeTranslation el botón de inicio de la animación de la parte inferior derecha y no de la parte inferior del centro de…
    La razón por la que pude pensar puede ser que el botón de superview también está en la posición incorrecta. Por favor, compruebe su botón y su superview marcos antes de animación bloque. Usted puede imprimir el registro justo debajo de la _menuBtn.transform = CGAffineTransformMakeScale(0.1f, 0.1f);, como: NSLog(@"_menuBtn: %@ ; _menuBtn.superview: %@", _menuBtn, _menuBtn.superview);
    me he puesto el botón de superview, pero aún no hay efecto..después me he puesto el superview, esto es lo que los registros de muestra: 2013-08-14 15:16:52.686 GJCoolNavi[12708:c07] _menuBtn: <UIButton: 0x80815c0; frame = (158.5 511.5; 3 3); transform = [0.1, 0, 0, 0.1, 0, 0]; opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x8081680>> ; _menuBtn.superview: <UIView: 0x8084380; frame = (160 513; 30 30); autoresize = RM+BM; layer = <CALayer: 0x8084430>> he imprimir el registro antes de que la animación se inicia.
    Ah, ese es el problema! El origin de su botón de superview es {160, 513} que es probablemente su centro de la parte inferior de la posición de la pantalla. Pero su botón de origin es {158.5, 511.5}, que es una posición relativa a su superview, en otras palabras, es la parte inferior derecha de la pantalla. Por favor, intente esto: _menuBtn.superview.frame = CGRectMake(0, 513, 320, 30); _menuBtn.frame = CGRectMake(145, 0, 30, 30); antes de la animación de bloque. Y voy a actualizar mi respuesta.
    mediante el código que he sugerido la _menuBtn marco es (158.5 -6.5; 3 3) y el superview es (0 513; 320 30)..y todavía el botón se inicia la animación de la parte inferior derecha.

    OriginalEl autor liuyaodong

  4. 0

    He utilizado tu código y su movimiento desde el centro de la parte inferior a la parte inferior izquierda a la perfección. Podría ser su superview no está en buen rect. Por favor consulte.

    OriginalEl autor Krishna Kumar

Dejar respuesta

Please enter your comment!
Please enter your name here