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

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

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) } 
  • Как показать клавиатуру для UIView
  • iPhone App - отклонение модального контроллера просмотра не отменяет его
  • Как нарисовать несколько UIBezierPath с разными цветами в UIView
  • Инверсная маска iOS в drawRect
  • iOS, setTransform, переопределенная setFrame? Преобразование без повторного рисования после повторного запуска setFrame
  • Тип границы на границе представления (iOS)
  • Применение физики Box2D к UIView против CALayer
  • Когда границы и рамки установлены для видов / слоев в Swift?
  • Самый эффективный способ манипулирования пикселями в UIView с помощью Swift
  • Autolayout изменяет размер UIButton с текстом, а затем открывается вид контейнера
  • Ограничения для subview не работают в iOS 8, XCode 6 (6A313). Работы iOS 7
  • Interesting Posts
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.