iOS rotación en imagenes y botones
Hace tiempo escribi un post de como hacer que UIImageView y UIButton hicieran una animación de rotación, en dicha función requería el tiempo en que iba a durar la vuelta y la dirección. ha estas categorías le he añadido dos funciones que detallare acontinuación.
En un proyecto necesitaba que un boton iniciara a rotar y que siguiera rotando hasta que una NSRequest terminara de hacer la petición, en CABasicAnimation tenemos un opción en la cual le podemos decir cuantas veces queremos que se repita la animación y en esta caso podemos poner la constante INFINITY y de este modo tenemos el elemento rotando infinitamente, ahora solo falta como decirle que deje de hacerlo, y aun que es facil eliminar una animación tenemos un problema y es que tenemos un efecto nada bueno, por que esta girando el elemento, eleminamos la animación y el elemento regresa a su posición original pero lo hace depronto, tenemos un efecto que se ve mal, como se logra ver en el siguiente video.
Yo lo que quería es que cuando le digamos que termine la animación, esta no importando donde se encuentre el elemento, termine el ciclo para que el elemento regrese a su posición original pero no de golpe, si no que siga animado hasta el final, para esto lo que hice hacer lo siguiente, terminar la actual animación, conocer el punto en que el elemento se encuentra y el tiempo restante para que el ciclo se complete e iniciar una nueva animación con estos datos, con esto logramos una animación correcta de que el elemento finalice el ciclo sin regresar al punto original de golpe. como lo pueden ver en el siguiente video.
como se puede ver no importa en que punto de la animación le digamos que pare, esta siempre termina el ciclo y lo hace fluido, no se nota cuando terminamos la animación e iniciamos la siguiente. pueden descargar las categorías de UIImageView y UIButton de mi github.
para usar las funciones lo hacemos de la siguiente forma:
solo unas cuestiones más, al inicio no sabia si hacer una categoría del objeto o una subclase, en varios post acerca de subclases para UIButton dicen que no es lo más recomedable por que se pierden algunas asociaciones y aun que en la documentación de apple no dice esto, se han reportado que algunas funcionalidades se pierden, por lo que la opción era hacerlo por medio de categorías, el problema que tenia usando categorías es que yo necesitaba tener agregar unas variables para la función de parar la rotación, se podia solucionar pasandole estas variables como parametros pero no me gustaba mucho que si ya colocaste esos parametros para iniciar la rotación tambien tuvieras que volver a ponerlos para finalizar la rotación, después de una una busqueda encontre que se puede hacer uso de funciones para asociar referencias (pueden ver la documentación aqui) esto nos permite asociar dos objectos, lo que hice fue cuando iniciamos la rotación haga las asociaciones y cuando terminamos la rotación recupero estos valores, con esto logre que la función para terminar la rotación no se tuviera que pasar parametros.
bueno espero que a alguien más le sirva