用动画填充水平视图(快速)

时间:2018-08-07 03:51:53

标签: swift animation uiview uiviewanimation

我正在尝试用动画填充水平视图(如进度条之类)(因此它将从左边缘向右填充)。

这是我所拥有的但不起作用

override init(frame: CGRect) {
    super.init(frame: frame)

    let outlineView = UIView()
    outlineView.layer.borderColor = UIColor.black.cgColor
    outlineView.layer.borderWidth = 1
    endorsementViews.append(outlineView)

    addSubview(outlineView)

    // custom UIView anchor extension
    outlineView.anchor(topAnchor, left: leftAnchor, bottom: nil, right: rightAnchor, topConstant: 12, leftConstant: 0, bottomConstant: 0, rightConstant: 0, widthConstant: 0, heightConstant: 75)

    let fillView = UIView()
    fillView.backgroundColor = .orange
    fillView.alpha = 0
    fillViews.append(fillView)

    outlineView.addSubview(fillView)

    // custom UIView anchor extension     
    fillView.anchor(outlineView.topAnchor, left: outlineView.leftAnchor, bottom: outlineView.bottomAnchor, right: nil, topConstant: 0, leftConstant: 0, bottomConstant: 0, rightConstant: 0, widthConstant: 195, heightConstant: 0)
}

override func layoutSubviews() {
    super.layoutSubviews()

    for index in 0...2 {
        let fillWidth = 75

        UIView.animate(withDuration: 3.5) {
            self.fillViews[index].frame.size.width = fillWidth
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您无需使用layoutSubviews()方法更改动画。如果您在动画中更改视图的大小,则fillView的大小也会在动画中更改。

但是,如果您想根据喜好更改fillView的帧:您应该在一个动作(或函数)中执行此操作,并在动画函数的底部使用视图的layoutIfNeeded()方法像这样:

func someFunction() {
    let fillWidth = 75
    UIView.animate(withDuration: 3.5)
       for index in 0...2 {
           self.fillViews[index].frame.size.width = fillWidth
       }
       self.layoutIfNeeded()
    }
}

注意: 您应该避免同时使用frame属性和约束来将框架设置为同一视图。您可以在动画中更改视图约束的属性,也可以通过layoutSubviews()方法设置视图的框架,并使用布尔控件检查子视图的实际状态以设置特定的框架(如果需要)。