我正在尝试用动画填充水平视图(如进度条之类)(因此它将从左边缘向右填充)。
这是我所拥有的但不起作用
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
}
}
}
答案 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()
方法设置视图的框架,并使用布尔控件检查子视图的实际状态以设置特定的框架(如果需要)。