Cómo cancelar UIView bloque basado en la animación?

He buscado montón de cosas ASÍ y en Apple referencias, pero todavía incapaz de controlar mi problema.

Lo que tengo:

  1. pantalla con 2 UIImageViews nad conectado con ellos 2 UIButtons
  2. 2 tipos de animación:

    2.1. primero es la ampliación, a continuación, cada una de las imágenes, una tras otra, sólo una vez en viewDidLoad
    2.2. segundo, cuando se presiona el botón (que es el botón personalizado, ocultos «dentro» de cada UIImageView) se activa la animación de la adecuada UIImageView – sólo uno, no tanto – (también a escala hacia arriba, luego hacia abajo).
  3. Como estoy escribiendo para iOS4+ me dicen que el uso de bloques basado en animaciones!

Lo que necesito:

Cómo cancelar la ejecución de la animación?
Me las he arreglado para cancelar después de todo, pero la última… :/
Aquí está mi fragmento de código:

[UIImageView animateWithDuration:2.0 
                               delay:0.1 
                             options:UIViewAnimationOptionAllowUserInteraction 
                          animations:^{
        isAnimating = YES;
        self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 2.0, 2.0);
    } completion:^(BOOL finished){
        if(! finished) return;
        [UIImageView animateWithDuration:2.0 
                                   delay:0.0 
                                 options:UIViewAnimationOptionAllowUserInteraction 
                              animations:^{
            self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 0.5, 0.5);
        } completion:^(BOOL finished){
            if(! finished) return;
            [UIImageView animateWithDuration:2.0 
                                       delay:0.0 
                                     options:UIViewAnimationOptionAllowUserInteraction 
                                  animations:^{
                self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 2.0, 2.0);
            } completion:^(BOOL finished){
                if(! finished) return;
                [UIImageView animateWithDuration:2.0 
                                           delay:0.0 
                                         options:UIViewAnimationOptionAllowUserInteraction 
                                      animations:^{
                    self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 0.5, 0.5);
                }
                                      completion:^(BOOL finished){
                                          if (!finished) return;
                                          //block letter buttons
                                          [self.bigLetterButton setUserInteractionEnabled:YES];
                                          [self.smallLetterButton setUserInteractionEnabled:YES];
                                          //NSLog(@"vieDidLoad animations finished");
                                      }];
            }];
        }];
    }];

De alguna manera el smallLetter UIImageView no está funcionando adecuadamente, porque cuando se presiona (a través del botón) bigLetter es la cancelación de animaciones correctamente…
gracias de antemano 🙂

EDICIÓN:
He utilizado esta solución, pero todavía tiene problemas con la escala hacia abajo smallLetter UIImageView – no cancelar a todos los…
solución

EDIT2: he añadido esto al comienzo de next/prev métodos:

- (void)stopAnimation:(UIImageView*)source {
    [UIView animateWithDuration:0.01
                          delay:0.0 
                        options:(UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction)
                     animations:^ {
                         source.transform = CGAffineTransformIdentity;
                     }
                     completion:NULL
     ];
}

problema permanece… :/ni idea de cómo interrumpir última animación de letras en la animación de la cadena de

  • Hey creo que Hari Kunwar la respuesta debe ser aceptado en la actualidad.
  • En estos días usted debe usar UIViewPropertyAnimator – que es tremendamente más fácil, también.
InformationsquelleAutor raistlin | 2012-03-05

4 Kommentare

  1. 142

    Puede detener todas las animaciones de una vista de llamada:

    [view.layer removeAllAnimations];

    (Tendrás que importar el QuartzCore marco para llamar a métodos en la vista.la capa).

    Si desea detener una animación específicas, no todas las animaciones, su mejor apuesta es usar CAAnimations explícitamente el lugar que el UIView animación métodos auxiliares, entonces usted tendrá un control más granular y puede dejar de animaciones explícitamente por su nombre.

    El corazón de la Manzana de la Animación de la documentación se puede encontrar aquí:

    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html

    • Sólo quiero añadir, en mi propia observación, posterior animateWithDuration no funciona después de llamar a removeAllAnimations. Esto es para hacer la paginación y tire de la actualización de los controles, tal vez alguien más podría observar algo diferente. Me acaban utilizando CABasicAnimation y llamadas [mivista.la capa de removeAnimationForKey:@»animationKey»];
    • Gracias por el tip @Nick – solo un mano a mano que el enlace ya no parece ser apoyado, intente esto en su lugar: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…
  2. 37

    Para iOS 10 uso UIViewPropertyAnimator a animar.
    Proporciona métodos para iniciar, detener y pausar UIView animaciones.

     let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){
            self.view.alpha = 0.0
     }
     //Call this to start animation.
     animator.startAnimation()
    
     //Call this to stop animation.
     animator.stopAnimation(true)
    • Es el único camino a seguir hoy en día.
  3. 3

    Que me gustaría añadir a Nick la respuesta de que hacer removeAllAnimations suave próxima idea de ser muy práctico.

    [view.layer removeAllAnimations];
    [UIView transitionWithView:self.redView
                      duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                          [view.layer displayIfNeeded];
                      } completion:nil];
  4. 0

    Que usted puede probar esto (en Swift):

    UIView.setAnimationsEnabled(false)
    UIView.setAnimationsEnabled(true)

    Nota: se puede poner el código entre las dos llamadas si es necesario, por ejemplo:

    UIView.setAnimationsEnabled(false)
    aview.layer.removeAllAnimations() //remove layer based animations e.g. aview.layer.opacity
    UIView.setAnimationsEnabled(true)

Kommentieren Sie den Artikel

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

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...