UIView animateWithDuration es demasiado rápido

He usado UIView animateWithDuration para boost el shapeLayer.frame.size.height en el código a continuación, pero independientemente de la duración, se anima muy rápido. Algunas publicaciones que encontré recomendaron usar un time de retraso que hice, pero todavía se anima muy rápido, ignorando la duración de 5 segundos establecida.

 private let minimalHeight: CGFloat = 50.0 private let shapeLayer = CAShapeLayer() override func loadView() { super.loadView() shapeLayer.frame = CGRect(x: 0.0, y: 0.0, width: view.bounds.width, height: minimalHeight) shapeLayer.backgroundColor = UIColor(networking: 57/255.0, green: 67/255.0, blue: 89/255.0, alpha: 1.0).CGColor view.layer.addSublayer(shapeLayer) } func delay(delay:Double, closure:()->()) { dispatch_after( dispatch_time( DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)) ), dispatch_get_main_queue(), closure) } override func viewDidAppear(animated: Bool) { delay(3) { UIView.animateWithDuration(5.0) { self.shapeLayer.frame.size.height += 400.0 } } 

¿Cómo puedo hacer que la animation se complete en 5 segundos?

Tal vez deberías probar CABasicAnimation

  let fromValue = view2.layer.bounds.height let toValue = view2.layer.bounds.height + 50 CATransaction.setDisableActions(true) //Not necessary view2.layer.bounds.size.height = toValue let positionAnimation = CABasicAnimation(keyPath:"bounds.size.height") positionAnimation.fromValue = fromValue positionAnimation.toValue = toValue positionAnimation.duration = 1 view2.layer.addAnimation(positionAnimation, forKey: "bounds") 

Intentalo :

 override func viewDidAppear(animated: Bool) { //You should not edit directly the frame here, or the change will be committed ASAP. Frame does not act like constraints. // create the new frame var newFrame = self.shapeLayer.frame newFrame.size.height += 400.0 UIView.animateWithDuration(5.0, delay: 3.0, options: .CurveEaseOut, animations: { //assign the new frame in the animation block self.shapeLayer.frame = newFrame }, completion: { finished in }) } 
  1. En lugar de poner el cambio dentro del bloque de animation, realice el cambio antes de la animation.

  2. Luego, en la animation, solo llame a superView.layoutIfNeeded ()

Me funciona, reference: ¿Cómo animo los cambios de restricción?