Intereting Posts
какой значок правильного размера для панели инструментов на iPhone Когда UITableViewCell находится в режиме редактирования, и мы перезагружаем UITableView, как сохранить эту конкретную ячейку в режиме редактирования даже после перезагрузки Ошибка OpenGL 0x0506 в – 530 для запуска проекта в divos в cocos2d? Как протестировать трансляцию ReplayKit в бета-версии iOS 10? Как установить начальный viewcontroller.xib в iOS с использованием цели c В сертификате проверки покупки приложения Сравнение двух NSDictionaries и Find Difference Как работать с другой средой на iOS? Язык iOS UIWebView для языка html Расширение поставщика документов IOS: определение хост-приложения Как узнать, когда generateCGImagesAsynchronly полностью завершена? Хорошо использовать ноль как BOOL для NO? Скрыть и отобразить masterView с помощью нажатия кнопки detailView IOS Есть ли способ отправить пользователю конкретный вид после нажатия «Просмотр» на уведомление? Реагировать Подвижные подтипы Native не добавляются в проект

Как обновить toValue / fromValue CABasicAnimation для более плавного изменения?

У меня есть 2 анимации, применяемых к CAShapeLayer ( pulseLayer ее pulseLayer ), с помощью этого кода:

 let scaledAnimation = CABasicAnimation(keyPath: "transform.scale.xy") scaledAnimation.duration = 0.75 scaledAnimation.repeatCount = Float.infinity scaledAnimation.autoreverses = true scaledAnimation.fromValue = 4 scaledAnimation.toValue = 4 scaledAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) let heartBeatAnimation = CABasicAnimation(keyPath: "transform.scale.xy") heartBeatAnimation.duration = 0.75 heartBeatAnimation.repeatCount = Float.infinity heartBeatAnimation.autoreverses = true heartBeatAnimation.fromValue = 1.0 heartBeatAnimation.toValue = 1.2 heartBeatAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) pulseLayer.add(heartBeatAnimation, forKey: "heartBeatAnimation") 

в какой-то момент, когда heartBeatAnimation мне нужно удалить анимацию сердечного ритма и добавить масштабированную анимацию с помощью этого кода:

 pulseLayer.add(self.scaledAnimation, forKey: "scaledAnimation") pulseLayer.opacity = 0.55 pulseLayer.removeAnimation(forKey: "heartBeatAnimation") 

но я не получал никакого плавного перехода между этими двумя анимациями, даже с UIView.animate()

поэтому я попытался остаться только с одной анимацией heartBeatAnimation и изменить ее toValue fromValue на то же значение, чтобы получить как scaledAnimation с помощью этого кода:

 heartBeatAnimation.toValue = 4 heartBeatAnimation.fromValue = 4 

ничего не произошло, когда анимация бьется после того, как анимация ушла, и пользователь делает какой-то жест, чтобы начать анимацию, я получил масштабированную устойчивую анимацию …!

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

Попробуйте это и посмотрите. Полная анимация и переключение между ними зависит от duration, count, fromValue and toValue свойств toValue CABasicAnimation с закрытием UIView.animate

 @IBOutlet var vwAnimation: UIView! let initialScale: CGFloat = 1.0 let animatingScale: CGFloat = 2.0 let finalScale: CGFloat = 3.0 override func viewDidLoad() { super.viewDidLoad() addAnimation() } func addAnimation(){ heartBeatAnimation() self.perform(#selector(self.switchAnimation), with: nil, afterDelay: 3.0) } @objc func switchAnimation(){ UIView.animate(withDuration: 0.25, animations: { self.vwAnimation.layer.removeAnimation(forKey: "heartBeatAnimation") self.scaledAnimation() self.vwAnimation.layoutIfNeeded() }) { (isCompleted) in } } func scaledAnimation() -> Void { let scaledAnimation = CABasicAnimation(keyPath: "transform.scale.xy") scaledAnimation.duration = 0.5 scaledAnimation.repeatCount = 0.5 scaledAnimation.autoreverses = true scaledAnimation.fromValue = initialScale scaledAnimation.toValue = finalScale scaledAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) vwAnimation.layer.add(scaledAnimation, forKey: "scaledAnimation") self.perform(#selector(self.adjustScale), with: nil, afterDelay: 0.5) } @objc func adjustScale(){ self.vwAnimation.layer.removeAnimation(forKey: "scaledAnimation") let scaleTransform = CGAffineTransform(scaleX: finalScale, y: finalScale) vwAnimation.transform = scaleTransform } func heartBeatAnimation() -> Void { let heartBeatAnimation = CABasicAnimation(keyPath: "transform.scale.xy") heartBeatAnimation.duration = 0.5 heartBeatAnimation.repeatCount = Float.infinity heartBeatAnimation.autoreverses = true heartBeatAnimation.fromValue = initialScale heartBeatAnimation.toValue = animatingScale heartBeatAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) vwAnimation.layer.add(heartBeatAnimation, forKey: "heartBeatAnimation") } 

Вот результат вышеуказанного кода и дайте мне знать, хотите ли изменения в этом результате:

введите описание изображения здесь

Без использования задержек и т. Д. И использования CATransaction и CASpringAnimations.

  import UIKit class ViewController: UIViewController { var shapeLayer : CAShapeLayer! var button : UIButton! override func viewDidLoad() { super.viewDidLoad() //add a shapelayer shapeLayer = CAShapeLayer() shapeLayer.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width/4, height: self.view.bounds.width/4) shapeLayer.position = self.view.center shapeLayer.path = drawStarPath(frame: shapeLayer.bounds).cgPath let color = UIColor(red: 0.989, green: 1.000, blue: 0.000, alpha: 1.000) shapeLayer.fillColor = color.cgColor self.view.layer.addSublayer(shapeLayer) //button for action button = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width - 20, height: 50)) button.center = self.view.center button.center.y = self.view.bounds.height - 70 button.addTarget(self, action: #selector(ViewController.pressed(sender:)), for: .touchUpInside) button.setTitle("Animate", for: .normal) button.setTitleColor(.blue, for: .normal) self.view.addSubview(button) } func pressed(sender:UIButton) { if button.titleLabel?.text == "Reset Layer"{ reset() return } //perform Animation button.isEnabled = false button.setTitle("Animating...", for: .normal) let heartBeatAnimation = CABasicAnimation(keyPath: "transform.scale.xy") heartBeatAnimation.duration = 0.5 heartBeatAnimation.repeatCount = 2 heartBeatAnimation.autoreverses = true heartBeatAnimation.fromValue = 1.0 heartBeatAnimation.toValue = 2.0 heartBeatAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) CATransaction.begin() CATransaction.setCompletionBlock { //call when finished [weak self] in if let vc = self{ vc.scaleUpToComplete() } } shapeLayer.add(heartBeatAnimation, forKey: "beatAnimation") CATransaction.commit() } func scaleUpToComplete(){ let scaledAnimation = CASpringAnimation(keyPath: "transform.scale.xy") scaledAnimation.duration = 0.7 scaledAnimation.fromValue = 1.0 scaledAnimation.toValue = 2.0 scaledAnimation.damping = 8.0 scaledAnimation.initialVelocity = 9 scaledAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) CATransaction.begin() CATransaction.setCompletionBlock { //set transform [weak self] in if let vc = self{ let scaleTransform = CATransform3DScale(CATransform3DIdentity, 2.0, 2.0, 1) vc.shapeLayer.transform = scaleTransform vc.shapeLayer.removeAllAnimations() //button title and enabled vc.button.isEnabled = true vc.button.setTitle("Reset Layer", for: .normal) } } shapeLayer.add(scaledAnimation, forKey: "scaleUp") CATransaction.commit() } func reset(){ let scaledAnimation = CASpringAnimation(keyPath: "transform.scale.xy") scaledAnimation.duration = 0.7 scaledAnimation.fromValue = 2.0 scaledAnimation.toValue = 1.0 scaledAnimation.damping = 8.0 scaledAnimation.initialVelocity = 9 scaledAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) CATransaction.begin() CATransaction.setCompletionBlock { //set transform [weak self] in if let vc = self{ let scaleTransform = CATransform3DScale(CATransform3DIdentity, 1.0, 1.0, 1) vc.shapeLayer.transform = scaleTransform vc.shapeLayer.removeAllAnimations() vc.button.setTitle("Animate", for: .normal) } } shapeLayer.add(scaledAnimation, forKey: "scaleDown") CATransaction.commit() } func drawStarPath(frame: CGRect = CGRect(x: 0, y: 0, width: 140, height: 140)) ->UIBezierPath{ //// Star Drawing let starPath = UIBezierPath() starPath.move(to: CGPoint(x: frame.minX + 0.50000 * frame.width, y: frame.minY + 0.21071 * frame.height)) starPath.addLine(to: CGPoint(x: frame.minX + 0.60202 * frame.width, y: frame.minY + 0.35958 * frame.height)) starPath.addLine(to: CGPoint(x: frame.minX + 0.77513 * frame.width, y: frame.minY + 0.41061 * frame.height)) starPath.addLine(to: CGPoint(x: frame.minX + 0.66508 * frame.width, y: frame.minY + 0.55364 * frame.height)) starPath.addLine(to: CGPoint(x: frame.minX + 0.67004 * frame.width, y: frame.minY + 0.73404 * frame.height)) starPath.addLine(to: CGPoint(x: frame.minX + 0.50000 * frame.width, y: frame.minY + 0.67357 * frame.height)) starPath.addLine(to: CGPoint(x: frame.minX + 0.32996 * frame.width, y: frame.minY + 0.73404 * frame.height)) starPath.addLine(to: CGPoint(x: frame.minX + 0.33492 * frame.width, y: frame.minY + 0.55364 * frame.height)) starPath.addLine(to: CGPoint(x: frame.minX + 0.22487 * frame.width, y: frame.minY + 0.41061 * frame.height)) starPath.addLine(to: CGPoint(x: frame.minX + 0.39798 * frame.width, y: frame.minY + 0.35958 * frame.height)) return starPath } }