UIView animateWithDuration 太快了

问题描述 投票:0回答:5

我在下面的代码中使用了

UIView
animateWithDuration
来增加
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秒内完成?

ios swift uiview swift2 animatewithduration
5个回答
2
投票

也许你应该尝试一下

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")

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

    })
}

0
投票
  1. 不要将更改放在动画块内,而是在动画之前进行更改。

  2. 然后,在动画中,只调用superView.layoutIfNeeded()

它对我有用,参考:如何为约束更改设置动画?


0
投票

就我而言,问题是代码动画中的其他地方被禁用:

[UIView setAnimationsEnabled:false];

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

[UIView setAnimationsEnabled:true];


0
投票

就我而言,我以编程方式将

animatedView
添加为
UIStackView
的排列子视图,以便我可以延迟加载它。调用
addArrangedSubview(animatedView)
后,我的
animatedView
已正确布局,但其动画以请求速度的 2 倍(或持续时间的一半)运行。

我只需在

layoutIfNeeded()
after
上调用 UIStackView 即可解决此问题,并将
animatedView
作为安排的子视图添加到其中。

但是,为了确认,我随后删除了

layoutIfNeeded()
调用,这应该会再次触发快速动画。令我惊讶的是,它并没有让问题回来。我是在模拟器中执行此操作,因此可能只是一些内部
UIKit
怪癖导致了它,因为一旦问题消失我就无法可靠地重现该问题。

但是在将动画视图添加为其子视图后,在父级上调用

layoutIfNeeded()
应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.