Estou tentando girar UIImageView
360 graus e já vi vários tutoriais online. Eu não conseguia fazer nenhum deles funcionar, sem UIView
parar ou pular para uma nova posição.
- Como posso conseguir isso?
A última coisa que tentei é:
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
Mas se eu usar 2 * pi, ele não se moverá (pois é a mesma posição). Se eu tentar fazer apenas pi (180 graus), funcionará, mas se eu chamar o método novamente, ele girará para trás.
EDIT :
[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!");
}];
também não funciona. Vai para 180
graus, faz uma pausa por uma fração de segundo e depois redefine para 0
graus antes de começar novamente.
Parabéns a Richard J. Ross III pela idéia, mas achei que o código dele não era exatamente o que eu precisava. O padrão para
options
, acredito, é dar a vocêUIViewAnimationOptionCurveEaseInOut
, o que não parece certo em uma animação contínua. Além disso, adicionei uma verificação para que eu pudesse interromper minha animação em um quarto de volta, se necessário (não infinito , mas de duração indefinida ) e fiz a aceleração acelerar durante os primeiros 90 graus e desacelerar nos últimos 90 graus (depois que uma parada foi solicitada):Atualizar
Eu adicionei a capacidade de lidar com solicitações para começar a girar novamente (
startSpin
), enquanto a rotação anterior está terminando. Exemplo de projeto aqui no Github .fonte
M_PI / 2
por- (M_PI / 2)
. (Role o código para a direita para ver o final de cada linha)0.5
segundos por 90 graus, como eu sou? Nesse caso, meu código não permite que você pare em uma fração de uma rotação de 90 graus. Ele permite que você pare em um número inteiro de intervalos de 90 graus, mas adiciona uma rotação extra de 90 graus, "facilitada". Portanto, no código acima, se você ligarstopSpin
após 0,35 segundos, ele girará por mais 0,65 segundos e parará em rotação total de 180 graus. Se você tiver perguntas mais detalhadas, provavelmente deverá abrir uma nova pergunta. Sinta-se livre para vincular a esta resposta.No Swift, você pode usar o seguinte código para rotação infinita:
Swift 4
Swift 3
Parar é como:
fonte
A resposta de Nate acima é ideal para parar e iniciar a animação e oferece um melhor controle. Fiquei intrigado porque o seu não funcionou e o dele. Eu queria compartilhar minhas descobertas aqui e uma versão mais simples do código que animaria um UIView continuamente sem parar.
Este é o código que eu usei,
Usei 'CGAffineTransformRotate' em vez de 'CGAffineTransformMakeRotation' porque o primeiro retorna o resultado que é salvo conforme a animação prossegue. Isso impedirá o salto ou a redefinição da exibição durante a animação.
Outra coisa é não usar 'UIViewAnimationOptionRepeat' porque, no final da animação, antes de começar a repetir, ela redefine a transformação, fazendo com que a exibição volte à sua posição original. Em vez de repetir, você recursa para que a transformação nunca seja redefinida para o valor original porque o bloco de animação praticamente nunca termina.
E a última coisa é que você deve transformar a exibição em etapas de 90 graus (M_PI / 2) em vez de 360 ou 180 graus (2 * M_PI ou M_PI). Porque a transformação ocorre como uma multiplicação matricial dos valores de seno e cosseno.
Então, digamos que se você usar uma transformação de 180 graus, o cosseno de 180 produz -1, transformando a visualização na direção oposta a cada vez (a resposta do Note-Nate também terá esse problema se você alterar o valor radiano da transformação para M_PI). Uma transformação de 360 graus é simplesmente pedir que a vista permaneça onde estava, portanto, você não vê nenhuma rotação.
fonte
rotateImageView
já nessa hora já havia terminado. Portanto, não é realmente recursivo nesse sentido.Se tudo o que você deseja fazer é girar a imagem sem parar, isso funciona muito bem e é muito simples:
Na minha experiência, isso funciona perfeitamente, mas certifique-se de que sua imagem seja capaz de girar em torno do centro sem compensações, ou a animação da imagem "saltará" assim que for para o PI.
Para alterar a direção do giro, altere o sinal de
angle
(angle *= -1
).Atualização Comentários por @AlexPretzlav me fez voltar a esta, e eu percebi que quando eu escrevi essa a imagem que eu estava girando foi espelhado ao longo tanto o eixo vertical e horizontal, ou seja, a imagem foi de fato única rotação de 90 graus e, em seguida, reiniciar, embora parecia como continuava girando a toda a volta.
Portanto, se sua imagem é como a minha, isso funcionará muito bem; no entanto, se a imagem não for simétrica, você notará o "snap" de volta à orientação original depois de 90 graus.
Para girar uma imagem não simétrica, é melhor ter a resposta aceita.
Uma dessas soluções menos elegantes, vista abaixo, realmente girará a imagem, mas pode haver uma gagueira perceptível quando a animação for reiniciada:
Você também pode fazer isso apenas com blocos, como sugere @ richard-j-ross-iii, mas você receberá um aviso de loop de retenção, pois o bloco está se capturando:
fonte
UIViewAnimationOptionRepeat
definido sua animaçãooptions
.Minha contribuição com uma extensão rápida da solução verificada:
Swift 4.0
Descontinuada :
fonte
.infinity
.A resposta impressionante de David Rysanek atualizada para Swift 4 :
fonte
Use um quarto de volta e aumente incrementalmente.
fonte
Isso estava funcionando para mim:
fonte
Eu encontrei um bom código neste repositório ,
Aqui está o código que eu fiz pequenas alterações de acordo com a minha necessidade de velocidade :)
UIImageView + Rotate.h
UIImageView + Rotate.m
fonte
Aqui está minha solução rápida como uma extensão UIView. Pode ser considerado como uma simulação de um comportamento UIActivityIndicator em qualquer UIImageView.
fonte
Uma versão Swift3:
E lembre-se de ligar
startRotate
paraviewWillAppear
não entrarviewDidLoad
.fonte
Você também pode fazer o mesmo tipo de animação usando UIView e blocos. Aqui está um método de extensão de classe que pode girar a vista por qualquer ângulo.
fonte
Se alguém quisesse a solução dos nates, mas rapidamente, aqui está uma tradução rápida:
fonte
para xamarin ios:
fonte
É assim que eu giro 360 na direção certa.
fonte
Crie a animação
Adicione-o a uma visualização como esta
Qual é a diferença desta resposta? Você terá um código de maneira mais limpa se a maioria de suas funções retornar objetos em vez de apenas manipular alguns objetos aqui e ali.
fonte
Existem várias maneiras de executar animação em 360 graus com o UIView.
Usando CABasicAnimation
Aqui estão as funções de extensão do UIView que manipulam as operações de início e parada da rotação:
Agora, usando o fechamento UIView.animation :
fonte
A resposta do @ ram foi realmente útil. Aqui está uma versão rápida da resposta.
Swift 2
Swift 3,4,5
fonte
var stop = false
private func stopRotation() { stop = true }
Então, dentro deif finished {...}
:if finished { if stop { return} self.rotateImageView() }
Eu desenvolvi uma estrutura de animação brilhante que pode economizar seu tom de tempo! Usando-o, esta animação pode ser criada com muita facilidade:
para parar esta animação, basta definir
nil
comoendlessRotater
.Se você estiver interessado, dê uma olhada: https://github.com/hip4yes/Animatics
fonte
Swift 4 ,
Ref.
fonte
Swift 4.0
fonte
Extensão UIView Swift 5 usando animações de quadro-chave
Essa abordagem nos permite usar diretamente o UIView.AnimationOptions.repeat
fonte
Rápido :
fonte
Swift 3:
fonte
fonte
Acho melhor você adicionar uma
UIVIew
categoria:Implementação UIView (Rodar)
Não usando este método :)
fonte