Я пытаюсь повернуть UIImageView
360 градусов и посмотрел несколько онлайн-уроков. Я не мог заставить никого из них работать без UIView
остановки или прыжка на новую позицию.
- Как мне этого добиться?
Последнее, что я попробовал, это:
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
Но если я использую 2 * пи, он вообще не двигается (поскольку это одна и та же позиция). Если я пытаюсь сделать только пи (180 градусов), это работает, но если я снова вызываю метод, он поворачивается назад.
РЕДАКТИРОВАТЬ :
[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!");
}];
тоже не работает. Он идет в 180
градусах, делает паузу на долю секунды, затем сбрасывается обратно в 0
градусы, прежде чем снова начнется.
Спасибо Ричарду Дж. Россу III за идею, но я обнаружил, что его код не совсем то, что мне нужно.
options
Я полагаю, что по умолчанию вам даютUIViewAnimationOptionCurveEaseInOut
, что не выглядит правильно в непрерывной анимации. Кроме того, я добавил проверку, чтобы при необходимости остановить анимацию на четном четверти оборота (не бесконечно , а на неопределенное время), и ускорил ускорение в течение первых 90 градусов и замедлил в течение последних 90 градусов. (после запроса на остановку):Обновить
Я добавил возможность обрабатывать запросы, чтобы снова начать вращаться (
startSpin
), пока предыдущий вращение завершается (завершается). Пример проекта здесь, на Github .источник
M_PI / 2
на- (M_PI / 2)
. (Прокрутите код вправо, чтобы увидеть конец каждой строки)0.5
секунды на 90 градусов, как и я? Если да, то мой код не позволяет останавливаться на фракции вращения в 90 градусов. Он позволяет вам останавливаться с интервалом в 90 градусов, но добавляет один дополнительный поворот на 90 градусов, «ослабленный». Таким образом, в приведенном выше коде, если вы позвонитеstopSpin
через 0,35 секунды, он будет вращаться еще 0,65 секунды и остановится при общем повороте на 180 градусов. Если у вас есть более подробные вопросы, вам, вероятно, следует открыть новый вопрос. Не стесняйтесь ссылаться на этот ответ.В Swift вы можете использовать следующий код для бесконечного вращения:
Swift 4
Свифт 3
Остановка это как:
источник
Ответ Нейта выше идеален для остановки и запуска анимации и дает лучший контроль. Я был заинтригован, почему ваш не работает, а он работает. Я хотел бы поделиться здесь своими выводами и более простой версией кода, который бы непрерывно анимировал UIView без сбоев.
Это код, который я использовал,
Я использовал «CGAffineTransformRotate» вместо «CGAffineTransformMakeRotation», потому что первый возвращает результат, который сохраняется в процессе анимации. Это предотвратит скачок или сброс вида во время анимации.
Другое дело не использовать UIViewAnimationOptionRepeat, потому что в конце анимации, прежде чем он начинает повторяться, он сбрасывает преобразование, заставляя представление вернуться в исходное положение. Вместо повтора вы выполняете рекурсию, чтобы преобразование никогда не сбрасывалось до исходного значения, поскольку блок анимации практически никогда не заканчивается.
И последнее, вы должны преобразовать вид с шагом 90 градусов (M_PI / 2) вместо 360 или 180 градусов (2 * M_PI или M_PI). Потому что преобразование происходит как матричное умножение значений синуса и косинуса.
Так, скажем, если вы используете 180-градусное преобразование, косинус 180 дает -1, заставляя представление трансформироваться в противоположном направлении каждый раз (ответ Нота-Нейта также будет иметь эту проблему, если вы измените радианое значение преобразования на M_PI). 360-градусное преобразование просто просит вид остаться там, где он был, следовательно, вы вообще не видите никакого поворота.
источник
rotateImageView
уже завершился. Так что это не совсем рекурсивно в этом смысле.Если все, что вы хотите сделать, это вращать изображение бесконечно, это работает довольно хорошо и очень просто:
По моему опыту, это работает безупречно, но будьте уверены, что ваше изображение способно вращаться вокруг его центра без каких-либо смещений, иначе анимация изображения будет «прыгать», как только она перейдет к PI.
Чтобы изменить направление вращения, измените знак
angle
(angle *= -1
).Обновление Комментариев @AlexPretzlav заставило меня вернуться к этому, и я понял, что когда я писал это, изображение, которое я вращал, отражалось вдоль вертикальной и горизонтальной оси, то есть изображение действительно вращалось только на 90 градусов и затем сбрасывалось, хотя выглядело как это продолжало вращаться полностью вокруг.
Таким образом, если ваше изображение похоже на мое, это будет прекрасно работать, однако, если изображение не симметрично, вы заметите «защелкивание» к исходной ориентации после 90 градусов.
Чтобы повернуть несимметричное изображение, вам лучше принять принятый ответ.
Одно из этих менее изящных решений, показанных ниже, будет действительно вращать изображение, но при перезапуске анимации может возникнуть заметное заикание:
Вы также можете сделать это только с блоками, как предлагает @ richard-j-ross-iii, но вы получите предупреждение о сохранении цикла, так как блок захватывает сам себя:
источник
UIViewAnimationOptionRepeat
установили анимациюoptions
.Мой вклад с расширением Swift от проверенного решения:
Swift 4.0
Устаревший:
источник
.infinity
.Удивительный ответ Дэвида Рисанека обновлен до Swift 4 :
источник
Используйте четверть оборота и увеличивайте его постепенно.
источник
Это работает для меня:
источник
Я нашел хороший код в этом хранилище ,
Вот код из этого я сделал небольшие изменения в соответствии с моей потребностью в скорости :)
UIImageView + Rotate.h
UIImageView + Rotate.m
источник
Вот мое быстрое решение как расширение UIView. Это можно рассматривать как симуляцию поведения UIActivityIndicator в любом UIImageView.
источник
Версия Swift3:
И не забудьте позвонить
startRotate
вviewWillAppear
неviewDidLoad
.источник
Вы также можете сделать анимацию того же типа, используя UIView и блоки. Вот метод расширения класса, который может вращать представление на любой угол.
источник
Если кто-то хотел найти решение Нейтса, но в быстром, то вот грубый быстрый перевод:
источник
для xamarin ios:
источник
Вот как я поворачиваю на 360 в правильном направлении.
источник
Создать анимацию
Добавьте это к представлению как это
Чем отличается этот ответ? У вас будет более чистый код, если большинство ваших функций будет возвращать объекты, а не просто манипулировать некоторыми объектами здесь и там.
источник
Существуют следующие способы выполнения 360-градусной анимации с помощью UIView.
Использование CABasicAnimation
Вот функции расширения для UIView, которые обрабатывают запуск и остановку операций вращения:
Теперь используем закрытие UIView.animation :
источник
@ ответ барана был действительно полезным. Вот Swift-версия ответа.
Swift 2
Свифт 3,4,5
источник
var stop = false
private func stopRotation() { stop = true }
Тогда внутриif finished {...}
:if finished { if stop { return} self.rotateImageView() }
Я разработал блестящий анимационный фреймворк, который поможет вам сэкономить время! С его помощью эту анимацию можно создать очень легко:
чтобы остановить эту анимацию просто установить
nil
вendlessRotater
.Если вы заинтересованы, пожалуйста, посмотрите: https://github.com/hip4yes/Animatics
источник
Swift 4 ,
ссылка
источник
Swift 4.0
источник
Расширение Swift 5 UIView с использованием анимации ключевых кадров
Этот подход позволяет нам напрямую использовать UIView.AnimationOptions.repeat
источник
Свифт:
источник
Свифт 3:
источник
источник
Я думаю, вам лучше добавить
UIVIew
категорию:Реализация UIView (Повернуть)
Не используя эти методы :)
источник