Estoy tratando de rotar UIImageView
360 grados y he visto varios tutoriales en línea. No pude conseguir que ninguno de ellos funcionara, sin UIView
parar ni saltar a una nueva posición.
- ¿Cómo puedo conseguir esto?
Lo último que he probado es:
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
Pero si uso 2 * pi, no se mueve en absoluto (ya que es la misma posición). Si intento hacer solo pi (180 grados), funciona, pero si vuelvo a llamar al método, gira hacia atrás.
EDITAR :
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
[UIView setAnimationRepeatCount:HUGE_VALF];
[UIView setAnimationBeginsFromCurrentState:YES];
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
tampoco funciona Va a 180
grados, hace una pausa por una fracción de segundo, luego se restablece a 0
grados antes de que comience nuevamente.
Felicitaciones a Richard J. Ross III por la idea, pero descubrí que su código no era exactamente lo que necesitaba. El valor predeterminado para
options
, creo, es darleUIViewAnimationOptionCurveEaseInOut
, que no se ve bien en una animación continua. Además, agregué un cheque para poder detener mi animación en un cuarto de vuelta si fuera necesario (no infinito , sino de duración indefinida ), e hice que la aceleración aumentara durante los primeros 90 grados, y desacelere durante los últimos 90 grados (después de solicitar una parada):Actualizar
Agregué la capacidad de manejar solicitudes para comenzar a girar nuevamente (
startSpin
), mientras que el giro anterior se está terminando (completando). Proyecto de muestra aquí en Github .fuente
M_PI / 2
con- (M_PI / 2)
. (Desplácese hacia la derecha para ver el final de cada línea)0.5
segundos por cada 90 grados, como yo? Si es así, mi código no le permite detenerse en una fracción de una rotación de 90 grados. Le permite detenerse en un número entero de intervalos de 90 grados, pero agrega una rotación adicional de 90 grados, "facilitada". Entonces, en el código anterior, si llamastopSpin
después de 0.35 segundos, girará durante otros 0.65 segundos y se detendrá a una rotación total de 180 grados. Si tiene preguntas más detalladas, probablemente debería abrir una nueva pregunta. Siéntase libre de vincular a esta respuesta.En Swift, puede usar el siguiente código para rotación infinita:
Swift 4
Swift 3
Parar es como:
fuente
La respuesta anterior de Nate es ideal para detener e iniciar la animación y ofrece un mejor control. Me intrigaba por qué el suyo no funcionaba y el suyo sí. Quería compartir mis hallazgos aquí y una versión más simple del código que animaría una UIView continuamente sin detenerse.
Este es el código que usé,
Usé 'CGAffineTransformRotate' en lugar de 'CGAffineTransformMakeRotation' porque el primero devuelve el resultado que se guarda a medida que avanza la animación. Esto evitará el salto o el restablecimiento de la vista durante la animación.
Otra cosa es no usar 'UIViewAnimationOptionRepeat' porque al final de la animación antes de que comience a repetirse, restablece la transformación haciendo que la vista vuelva a su posición original. En lugar de una repetición, usted recurre para que la transformación nunca se restablezca al valor original porque el bloque de animación prácticamente nunca termina.
Y lo último es que debe transformar la vista en pasos de 90 grados (M_PI / 2) en lugar de 360 o 180 grados (2 * M_PI o M_PI). Porque la transformación se produce como una multiplicación matricial de los valores seno y coseno.
Entonces, digamos que si usa una transformación de 180 grados, el coseno de 180 produce -1 haciendo que la vista se transforme en dirección opuesta cada vez (la respuesta de Note-Nate también tendrá este problema si cambia el valor en radianes de la transformación a M_PI). Una transformación de 360 grados es simplemente pedirle a la vista que permanezca donde estaba, por lo tanto, no ve ninguna rotación en absoluto.
fuente
rotateImageView
ya ha terminado. Entonces no es realmente recursivo en ese sentido.Si todo lo que quiere hacer es rotar la imagen sin cesar, esto funciona bastante bien y es muy simple:
En mi experiencia, esto funciona a la perfección, pero asegúrese de que su imagen sea capaz de girar alrededor de su centro sin ningún desplazamiento, o la animación de la imagen "saltará" una vez que llegue a PI.
Para cambiar la dirección del giro, cambie el signo de
angle
(angle *= -1
).Los comentarios de actualización de @AlexPretzlav me hicieron volver a visitar esto, y me di cuenta de que cuando escribí esto, la imagen que estaba girando se reflejó a lo largo del eje vertical y horizontal, lo que significa que la imagen en realidad solo giraba 90 grados y luego se reiniciaba, aunque parecía como continuaba girando todo el camino.
Entonces, si su imagen es como la mía, esto funcionará muy bien, sin embargo, si la imagen no es simétrica, notará el "ajuste" de nuevo a la orientación original después de 90 grados.
Para rotar una imagen no simétrica, es mejor que con la respuesta aceptada.
Una de estas soluciones menos elegantes, que se ve a continuación, realmente rotará la imagen, pero puede haber un tartamudeo notable cuando se reinicia la animación:
También puede hacer esto solo con bloques, como sugiere @ richard-j-ross-iii, pero recibirá una advertencia de bucle de retención ya que el bloque se está capturando a sí mismo:
fuente
UIViewAnimationOptionRepeat
configurado su animaciónoptions
.Mi contribución con una extensión Swift de la solución marcada:
Swift 4.0
Obsoleto :
fuente
.infinity
.La increíble respuesta de David Rysanek actualizada a Swift 4 :
fuente
Use cuarto de turno y aumente el turno gradualmente.
fuente
Esto estaba funcionando para mí:
fuente
He encontrado un buen código en este repositorio ,
Aquí está el código, he realizado pequeños cambios según mi necesidad de velocidad :)
UIImageView + Rotate.h
UIImageView + Rotate.m
fuente
Aquí está mi solución rápida como una extensión UIView. Podría considerarse como una simulación de un comportamiento UIActivityIndicator en cualquier UIImageView.
fuente
Una versión Swift3:
Y recuerde llamar
startRotate
enviewWillAppear
no enviewDidLoad
.fuente
También puedes hacer el mismo tipo de animación usando UIView y bloques. Aquí hay un método de extensión de clase que puede rotar la vista en cualquier ángulo.
fuente
Si alguien quería la solución de Nates pero de manera rápida, aquí hay una traducción rápida y aproximada:
fuente
para xamarin ios:
fuente
Así es como giro 360 en la dirección correcta.
fuente
Crea la animación
Agréguelo a una vista como esta
¿Cómo es diferente esta respuesta? Tendrá un código más limpio si la mayoría de sus funciones devuelve objetos en lugar de simplemente manipular algunos objetos aquí y allá.
fuente
Existen diferentes formas de realizar animaciones de 360 grados con UIView.
Usando CABasicAnimation
Aquí hay una extensión de funciones para UIView que maneja las operaciones de rotación de inicio y parada:
Ahora usando, cierre UIView.animation :
fuente
La respuesta de @ ram fue realmente útil. Aquí hay una versión rápida de la respuesta.
Swift 2
Swift 3,4,5
fuente
var stop = false
private func stopRotation() { stop = true }
Luego, adentroif finished {...}
:if finished { if stop { return} self.rotateImageView() }
¡He desarrollado un marco de animación brillante que puede ahorrarle mucho tiempo! Al usarlo, esta animación se puede crear muy fácilmente:
para detener esta animación simplemente configúrelo
nil
enendlessRotater
.Si está interesado, eche un vistazo: https://github.com/hip4yes/Animatics
fuente
Swift 4 ,
Árbitro
fuente
Swift 4.0
fuente
Extensión Swift 5 UIView usando animaciones de fotogramas clave
Este enfoque nos permite usar directamente UIView.AnimationOptions.repeat
fuente
Rápido:
fuente
Swift 3:
fuente
fuente
Creo que deberías agregar una
UIVIew
Categoría:Implementación UIView (Rotar)
No estoy usando estos métodos :)
fuente