UIView animateWithDuration 太快了

Posted

技术标签:

【中文标题】UIView animateWithDuration 太快了【英文标题】:UIView animateWithDuration is too fast 【发布时间】:2016-03-09 08:59:48 【问题描述】:

我在下面的代码中使用UIViewanimateWithDuration 来增加shapeLayer.frame.size.height,但不管持续时间如何,它的动画速度都非常快。我发现一些帖子建议使用我已经完成的一些延迟时间,但它仍然非常快速地制作动画,忽略了我设置的 5 秒持续时间。

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(red: 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
        
    

如何让动画在 5 秒内完成?

【问题讨论】:

【参考方案1】:

也许你应该试试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")

【讨论】:

谢谢,它工作正常,但我真的很想知道为什么 animateWithDuration 不能工作。 因为您正在使用适用于 UIView 的动画方法。您正在尝试为 CALayer 女巫设置动画,这是一个较低级别的组件。 如果您能帮我看看这个 SO 问题 goo.gl/iqSmQq,我将不胜感激,我无法在这方面取得任何进展【参考方案2】:

试试看:

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.animate(withDuration: 5.0, delay: 3.0, options: .curveEaseOut, animations: 
        //assign the new frame in the animation block
        self.shapeLayer.frame = newFrame
    , completion:  finished in

    )

【讨论】:

我试过上面的代码但是动画还是很快的 动画很快还是没有动画? 基本上,它会在不到一秒的时间内从原来的位置移动到预期的位置。这就是为什么我说动画非常快 ***.com/questions/12958041/… 也许解决方案就在这里。 链接中的第二种方法是我最初所做的【参考方案3】:

    不是将更改放在动画块中,而是在动画之前进行更改。

    那么,在动画中,只调用superView.layoutIfNeeded()

它对我有用,参考:How do I animate constraint changes?

【讨论】:

【参考方案4】:

在我的情况下,问题是代码动画中的其他地方被禁用:

[UIView setAnimationsEnabled:false];

将其更改为 true 解决了问题:

[UIView setAnimationsEnabled:true];

【讨论】:

以上是关于UIView animateWithDuration 太快了的主要内容,如果未能解决你的问题,请参考以下文章

在 UIView2 上方显示 UIView1,但在 UIView1 上方显示 UIView2 输入方式

统计从多个 UIView 中随机抽出的 UIView 数量,即:从 9 个 UIView 中随机抽出 5 个 UIView,然后执行操作

UIView 类别 - 自定义方法不返回 UIView

IOS将UIVIew中的UIImageView扁平化为单个UIView [重复]

UIView - 啥覆盖将允许更新 UIView 框架

UIView 中的 UIView 问题