UIView animación salta al principio

Estoy ejecutando este código…

[UIView animateWithDuration:0.2
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{

                     CGAffineTransform settingsTransform = CGAffineTransformMakeTranslation(self.settingsView.frame.size.width, 0);
                     CGAffineTransform speedTransform = CGAffineTransformMakeTranslation(-self.speedView.frame.size.width, 0);

                     self.settingsView.transform = settingsTransform;
                     self.speedView.transform = speedTransform;

                 } completion:nil];

Pero cuando se ejecuta la opinión saltar la mitad de la transformación en la dirección opuesta antes de deslizar a la mitad de la posición en la dirección correcta.

He ralentizado la animación duración de 5 segundos, pero el salto inicial es instantáneo y la mitad de la transformación en la dirección equivocada.

Cuando me anime de nuevo utilizando este código…

[UIView animateWithDuration:0.2
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{
                     self.settingsView.transform = CGAffineTransformIdentity;
                     self.speedView.transform = CGAffineTransformIdentity;
                 } completion:nil];

Es exactamente la misma cosa.

El resultado es que el último movimiento es la mitad de la deseada transformación, ya que salta a la mitad de la transformación en la dirección equivocada primera.

Yo realmente no se puede averiguar por qué está sucediendo esto?

Ideas.

::EDIT::

A despejar un poco de posible ambigüedad.

No estoy tratando de tener estos puntos de vista «rebote» de vuelta a donde están. Las vistas estoy animando son como el panel de control en el borde de la pantalla. Cuando el usuario presiona el botón «ir» a la vista, a continuación, deslice fuera del camino. Cuando el usuario presiona el botón «detener» los paneles posterior presentación en la vista.

A menos que antes. Desde la habilitación de diseño automático (que necesito para otras partes de la aplicación) yo no sólo puede cambiar el marco de las vistas para que yo fui el de la transformación de la ruta.

Se puede ver este efecto pegando un punto de vista en un controlador de vista y un botón para ejecutar la animación.

Gracias

  • Acabo de configurar un nuevo proyecto con un solo VC (en un guión gráfico) y en el punto de vista de la VC es de un solo botón y un único punto de vista (fondo rojo). El botón de la anima (usando el mismo código anterior) el rojo de la vista de izquierda a derecha mediante transformaciones. Pero salta exactamente de la misma manera.
  • Cuando y donde la animación comienza?
  • Es en su propia función, que se activa pulsando un botón. He utilizado para hacer la animación al cambiar los marcos de las vistas, pero la disposición automática parece que no me gusta hacer eso. Usted puede ver el efecto de sí mismo mediante la creación de un proyecto con un botón y una etiqueta (o algo más para animar). En la función de disparador para la UIButton utilizar el código anterior para animar la etiqueta. Usted puede ver el salto antes de que la animación se inicia. Acerca de 10 líneas de código máximo (más el IB cosas).
  • que el sdk está utilizando? y la versión de xcode?
  • ¿Quieres una vista que animar a sí mismo de izquierda a derecha varias veces? si sí, hay una manera más sencilla de lograr esto
  • Hola, no, estas animaciones son completamente independientes el uno del otro. Ver editar en la OP. Gracias
  • Hizo considerar el uso de la UIViewAnimationOptionBeginFromCurrentstate opción para su segundo de la animación? He probado tu código va a animar sus puntos de vista a la derecha y detenerse como se esperaba. Si usted quiere que su segunda animación de inicio en cualquier momento y desde donde la primera animación es el uso de esta bandera que he mencionado.
  • Hola, he probado el de comenzar desde el estado actual de la opción, pero no tiene ningún efecto. Es usted el uso de auto-diseño, en su opinión, cuando lo ha intentado? Solo puedo pensar que es la causa de esto? Gracias de nuevo
  • funciona en mi caso(con o sin la auto-layout) tengo una vista que se traduce a la derecha y cuando hago clic en un botón se va a fijar la vista atrás a su posición original: es independiente de la situación de la primera animación (ya sea que haya terminado o no).

InformationsquelleAutor Fogmeister | 2012-09-21

8 Kommentare

  1. 67

    Tuve el mismo problema así que aquí está la solución que se me ocurrió.

        CGAffineTransform transform = CGAffineTransformMake(1, 0, 0, 1, translation.x, translation.y);
        [UIView animateWithDuration:0.25 animations:^{
            _assetImageView.transform = transform;
            [self.view layoutIfNeeded];
        } completion:^(BOOL finished) {
        }];

    Así que llame a [auto.ver layoutIfNeeded]; dentro de las animar bloque. Sin esto la tiene el mismo problema que usted y salta la distancia negativo en conversión de primera, a continuación, anima a la posición correcta a partir de ahí. Estoy llamando a esto, a partir de una vista controlador para que el auto es una sub clase de UIViewController. En el caso de «auto.ver» puede no existir, pero espero que usted consigue la idea.

    • Gracias, voy a darle una oportunidad!
    • Gracias, esta trabajado. Alguien tiene una buena explicación de por qué funciona esto?
    • Este debe marcar la respuesta correcta, ya que se requiere debido a la naturaleza de la animación de las restricciones. Esto funcionó bien para mí!
    • Wow esa es una solución aleatoria que funciona a la perfección! Alguna idea de por qué funciona?
    • Curiosamente, he tenido este problema y esta trabajado para mí, aunque yo no soy de usar Autodiseño. (No tengo una pluma, y yo no soy la adición de ningún tipo de restricciones para mi punto de vista.) Mis puntos de vista fueron saltando al inicio de una escala de transformación, y con esta revisión no. ¿Alguien tiene una explicación de por qué esto funciona en un no-autodiseño proyecto?
    • La vaca sagrada, @davidnesbitt es mi héroe! He estado buscando una solución a esto por lo menos un año y luchando con la mierda de trabajo soluciones en el momento. You ROCK!
    • Nesbitt – esto funciona, muchas gracias! Podría usted explicar por qué, a pesar de que? Estoy muy curioso!
    • layoutIfNeed actualizará cada vez después de la primera carga, layoutSubviews se actualizará cada vez que incluyen la primera carga
    • Todavía tengo el mismo problema. Si tengo una afín a la rotación y la escala en su lugar antes de la animación, se sesga muy mal. Si hay un retraso, permanece en esta posición sesgada y anima a partir de la desigual posición para la final que desee transformar. Puedo animar a partir de una escala a una escala de+a transformar sin problema. Es justo la animación a partir de una escala de+a transformar a otra escala+de transformación. Se utiliza para trabajar en más viejas versiones de iOS.

  2. 15

    Ninguna de las soluciones que aquí se trabajó para mí… Mi animación siempre iba a saltar. (excepto cuando se fue a la derecha en el extremo de otra animación, pista).

    Algunos detalles:

    El punto de vista de que estaba haciendo tenía una serie de escala y se traduce ya en la pila.

    Solución:

    Haciendo un fotograma de la animación, con un súper corto que la primera clave que, básicamente, volver a aplicar la transformación que la última animación en la que debería.

        UIView.animateKeyframesWithDuration(0.4, delay: 0.0, options: [.CalculationModeCubic], animations: { () -> Void in
            //reset start point
            UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.01, animations: { () -> Void in
                self.element.transform = initialTransform
            })
    
            UIView.addKeyframeWithRelativeStartTime(0.01, relativeDuration: 0.99, animations: { () -> Void in
                self.element.transform = finalTransform
            })
        }, completion: nil)
    • El error es todavía presente en iOS 9.3. Esta es la única solución de trabajo.
    • Andrés, estoy en el temor. Tú eres mi héroe. Bravo!!! (Una cosa menor … creo que tienes una errata. La última relativeDuration debe ser 0.99 no 0.39, ¿verdad?)
    • gracias! Has probado? Hizo alguna diferencia? La parte superior de mi cabeza, ya que la duración es relativa en el total aquí es de 0.4, por lo que sería lo mismo como claves de ~0.025 & ~0.975. No estoy seguro de si he probado diferentes rangos y esta trabajado duraciones y esto funcionó, o si había otro fotograma clave en el que hay antes.
    • Hice la prueba usando «relativeDuration: 0.99» y funcionó como se esperaba de esa manera (brillantemente!). Y 0,99 es correcta, ya que es un relación duración. Desde el addKeyFrame documentación: // start time and duration are values between 0.0 and 1.0 specifying time and duration relative to the overall time of the keyframe animation
    • A la derecha está! También se probó en el patio de recreo. Respuesta actualizada a 0.99.
    • Gracias. Esta es una gran solución!
    • Encantados de ayudarle! iOS errores parecen como yo.
    • Todavía presentes en iOS 10.1. Trabajó como un encanto. Gracias. También se puede hacer un «auto.elemento.transformar = auto.elemento.transformar» – la misma cosa, menos instantialized variables, igual de claro.

  3. 8

    OK, habiendo visto la WWDC videos de nuevo afirman que una de las primeras cosas que debes hacer cuando el uso de Autodiseño es eliminar cualquier tipo de llamadas para setFrame.

    Debido a la complejidad de la pantalla me ha quitado el Auto-Diseño completamente y ahora estoy utilizando el marco ubicación para moverse a la vista de la pantalla.

    Gracias

    • Deshabilitar el Auto-Diseño solucionado mi problema. Gracias.
  4. 8

    He pedido Soporte Técnico de Apple acerca de este problema y me esta respuesta, por lo que es un error.

    iOS 8 en la actualidad exhibe un error conocido en UIKit animaciones donde
    transformar las animaciones llegue el mal fromValue (que afecta principalmente a los
    la posición de los objetos animados, haciéndolos aparecer a «saltar»
    inesperadamente, en el inicio de una animación).

    […]

    La solución hasta que una solución posible es entregada a bajar a
    Core Animation Api de código en sus animaciones.

    • Esta pregunta fue escrito hace 3 años. No fue un error, a continuación,. Era de diseño auto y no me animar correctamente.
    • Agradezco esta respuesta, ya que es exactamente el error que estoy ejecutando en.
    • esto me estaba volviendo loco! trabaja en iOS7 – falla en iOS 8
  5. 3

    Aquí la versión mejorada de Andreas respuesta
    La diferencia clave es que usted puede especificar sólo un fotograma clave y obtener menos código

    UIView.animateKeyframes(withDuration: animationDuration, delay: 0.0, options: [], animations: {
      UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 1.0, animations: {
        animatedView.transform = newTransform
        })
      }, completion: nil)
  6. 1

    ¿Su settingsView o speedView ya tiene una transformación aplicada antes de esta animación se lleva a cabo?

    Si las transformaciones de estos puntos de vista no es la identidad de la transformación (aka CGAffineTransformIdentity, también conocido como ninguna transformación), usted no puede tener acceso a su .las propiedades del marco.

    UIViews » marco de propiedades no son válidos cuando se tiene una transformación aplicada a ellos. El uso de «límites» en su lugar.

    • Gracias por la respuesta. La transformación no es tocado antes de intentar la animación y cuando el segundo de animación (volviendo a CGAffineTransformIdentity) se va de vuelta a donde comenzó a partir de. Gracias
    • Si juntas un proyecto para tratar de esto se puede ver lo que está sucediendo. Todo lo que toma es un botón para presionar y vistas a animar. Cuando se anima a que salta la vista hacia atrás antes de avanzar.
  7. 1

    Ya que usted quiere que su segundo de animación que se produce desde el estado actual de su primera animación (si está terminado o no) recomiendo el uso de la UIViewAnimationOptionLayoutSubviews opción a la hora de establecer su segunda animación.

    [UIView animateWithDuration:0.2
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionLayoutSubviews
                     animations:^{
                         self.settingsView.transform = CGAffineTransformIdentity;
                         self.speedView.transform = CGAffineTransformIdentity;
                     } completion:nil];

    Aquí se muestra un ejemplo del código que he usado para las pruebas utilizando el controlador de vista del modelo:

    myviewcontroller.m:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        self.animatedView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 160, 80)];
        self.animatedView.backgroundColor = [UIColor yellowColor];
    
        [UIView animateWithDuration:0.2
                              delay:0.0
                            options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionLayoutSubviews
                         animations:^{
                             CGAffineTransform settingsTransform = CGAffineTransformMakeTranslation(self.animatedView.frame.size.width, 0);
    
                             self.animatedView.transform = settingsTransform;
    
                         }
                         completion:nil];
        self.buttonToTest = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        self.buttonToTest.frame = CGRectMake(90, 20, 80, 40);
        [self.buttonToTest setTitle:@"Click Me!" forState:UIControlStateNormal];
        [self.buttonToTest addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];
    
        //set-up view hierarchy
        [self.view addSubview:self.buttonToTest];
        [self.view addSubview: self.animatedView];
    
    }
    
    - (void) buttonClicked
    {
        [UIView animateWithDuration:.2
                              delay:0.0
                            options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionLayoutSubviews
                         animations:^{
                             self.animatedView.transform = CGAffineTransformIdentity;
    
                         }
                         completion:nil];
    }
    • Hola, estas dos animaciones son completamente independientes el uno del otro. No estoy tratando de de la cadena de ellos juntos. Consulte edición de OP. Gracias
    • La primera vez que el usuario pulse el botón se mueve a la derecha. Cuando el usuario presiona de nuevo la vista vuelve a donde estaba. Cada animación tiene un único movimiento de la diapositiva de una manera. Si configura un proyecto con los puntos de vista que se muestra en la OP puede ver que esto ocurra.
  8. 0

    He tenido este problema y resuelto por:

    1. Ocultar la vista original
    2. Agregar una temp punto de vista de que las copias de la vista que desea animar
    3. Llevar a cabo la animación que ahora va a ser como la intención de
    4. Quitar la temp ver y mostrar la vista original con el estado final

    Espero que esto ayude.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea