Плавно ускорить анимацию вращения вращения

Я использую этот код для поворота любого вида:

func rotateAnimation(theView: UIView, duration: CFTimeInterval = 20.0, repeatCount: Float = 200, toValue: CGFloat = CGFloat(.pi * 2.0)) { let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") rotateAnimation.fromValue = 0.0 rotateAnimation.toValue = toValue rotateAnimation.duration = duration rotateAnimation.repeatCount = repeatCount theView.layer.add(rotateAnimation, forKey: nil) } 

Я хотел бы знать, как ускорить текущую анимацию. Если, например, UIView вращается с указанным выше кодом, как я могу сделать эту скорость в два раза быстрее с хорошей трансацией?

Итак: вызовы rotateAnimation : вращение с нормальной скоростью -> функция звонков? -> UIView будет плавно вращаться быстрее до желаемой скорости -> UIView будет продолжать вращаться с желаемой скоростью.

Спасибо за любую помощь.

3 Solutions collect form web for “Плавно ускорить анимацию вращения вращения”

Попробуйте ниже код

  let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { (timer) in self.viewToMove.layer.timeOffset = self.viewToMove.layer.convertTime(CACurrentMediaTime(), from: nil) self.viewToMove.layer.beginTime = CACurrentMediaTime() self.viewToMove.layer.speed += 0.5 } timer.fire() 

Он будет очень быстро увеличивать скорость анимации

Попробуйте это для второй анимации

Вы можете установить меньшую продолжительность для увеличения скорости

 func rotateAnimation(theView: UIView, duration: CFTimeInterval = 0.4, repeatCount: Float = 200, toValue: CGFloat = CGFloat(.pi * 2.0)) { let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") rotateAnimation.fromValue = 0.0 rotateAnimation.toValue = toValue rotateAnimation.duration = duration rotateAnimation.repeatCount = repeatCount 

И установите shouldRasterize = true для лучшей производительности

  theView.layer.rasterizationScale = UIScreen.main.scale theView.layer.shouldRasterize = true 

Используйте тот же ключ для обеих анимаций

  theView.layer.add(rotateAnimation, forKey: "animation") } 

Установите повторение на 1 и повторно добавьте анимацию после остановки каждой анимации. Я не уверен, вызвала ли это проблему производительности в вашем сценарии, так как я тестировал ее с помощью очень простого квадратного представления.

Добавляя параметр CAMediaTimingFunction , вы можете контролировать, использовать ли kCAMediaTimingFunctionLinear для этих обычных циклов анимации или использовать пользовательский, например kCAMediaTimingFunctionEaseIn для ключевого кадра анимации, чтобы показать плавный переход.

 // your function to start the acceleration @IBAction func buttonTapped(_ sender: UIButton) { accel = true speed = 2.0 timeOffset = self.rect.layer.convertTime(CACurrentMediaTime(), from: nil) timeOffset = timeOffset - lastStart // memorize the timeoffset, new speed (2x) and a boolean flag self.rect.layer.removeAllAnimations() } // delegate - memorize the CFTimeInterval func animationDidStart(_ anim: CAAnimation) { lastStart = self.rect.layer.convertTime(CACurrentMediaTime(), from: nil) } // delegate - start a new loop of animation each time it's stopped func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { if accel { accel = false let opt = CAMediaTimingFunction(controlPoints: 0.5, 0.2, 0.9, 0.7) rotateAnimation(theView: rect, speed: speed, fromValue: CGFloat(.pi * 2.0 * Float(timeOffset) / 10.0), toValue: CGFloat(.pi * 2.0 * Float(timeOffset) / 10.0 + .pi * 2.0), option: opt) } else { rotateAnimation(theView: rect, speed: speed, fromValue: CGFloat(.pi * 2.0 * Float(timeOffset) / 10.0), toValue: CGFloat(.pi * 2.0 * Float(timeOffset) / 10.0 + .pi * 2.0)) // note that timeOffset is initialize to be 0. } } 

Вам нужна пользовательская функция CAMediaTimingFunction, начинающаяся с наклона 0.5 и постепенно увеличивающаяся до 1.0, я не оптимизировал кривую Безье здесь, вы можете сделать свою собственную желаемую кривую.

Наконец, немного подкорректируйте свою анимационную функцию:

 func rotateAnimation(theView: UIView, speed: Float, duration: CFTimeInterval = 10.0, fromValue: CGFloat = CGFloat(0.0), toValue: CGFloat = CGFloat(.pi * 2.0), option: CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)) { let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") rotateAnimation.fromValue = fromValue rotateAnimation.toValue = toValue rotateAnimation.duration = duration rotateAnimation.speed = speed rotateAnimation.repeatCount = 1 rotateAnimation.delegate = self rotateAnimation.timingFunction = option theView.layer.add(rotateAnimation, forKey: nil) } 
  • Передача событий на другое представление
  • Каков правильный способ удаления подвью из иерархии представлений и nuke?
  • Обнаружение, если UIView пересекает другие UIViews
  • Как сделать автоматический просмотр UIView в полноэкранном режиме при переключении ориентации
  • сделать UIView с добавлением subviews в одно изображение?
  • Draw Shadow Only * Around * UIView, который содержит прозрачность
  • Есть ли способ наблюдать изменения в fractionComplete в UIViewPropertyAnimator
  • Почему я не могу манипулировать объектами в моем файле xib?
  • Как маскировать UIViews в iOS
  • Subview отображается неправильно
  • Отображение содержимого UIView, загруженного из xib в раскадровке
  • Interesting Posts

    core-plot, неспособный построить два графика

    Задайте два ограничения UIButton?

    Нет звука при воспроизведении видео в ионном приложении на устройстве iPhone

    Каковы наилучшие методы общения с представлениями контейнера

    Прокрутка, когда UIScrollView внутри UIScrollView

    Как я могу символизировать копию / вставку отчета о сбоях?

    Распознаватели жестов и автоматическая компоновка в iOS6, масштабирование от центра

    Объявления iAd в ландшафтном режиме для приложения только для портрета

    Как установить iOS 4.3 Simulator на Xcode 4.5?

    Как изменить кнопку удаления по умолчанию в ячейке просмотра таблицы в Swift?

    локализация в ios swift. как я могу изменить язык приложения во время выполнения

    Объекты не сохраняются в SQL Lite, хотя он говорит, что он был сохранен

    Как удалить верхнюю панель клавиатуры в ios 7

    анимационный uibutton, применяющий изображения быстро

    Экспорт видеофайлов AVAssetExportSession с несколькими звуковыми дорожками

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.