【发布时间】:2021-06-23 12:02:49
【问题描述】:
我正在尝试为自定义 UIView 中的约束设置动画。结束布局是正确的,但我无法让UIView.animate 正常工作,而且我看到每个人都在从视图控制器调用self.view.layoutIfNeeded(),所以这也许是我的问题。我在自定义视图本身上调用self.layoutIfNeeded()。如果层次结构很重要,我有如下内容:ViewController > TableView > Cell > View > AnimationView。
class AnimationView: UIView {
// MARK: - Properties
let ratioMultiplier: CGFloat = 0.28
var listLeadingConstraint: NSLayoutConstraint!
var listTrailingConstraint: NSLayoutConstraint!
var checkmarkLeadingConstraint: NSLayoutConstraint!
var checkmarkTrailingConstraint: NSLayoutConstraint!
// MARK: - UI Components
lazy var listImageView: UIImageView = {
let image = UIImage(named: "list.small")
let result = UIImageView(image: image)
return result
}()
lazy var checkmarkImageView: UIImageView = {
let image = UIImage(named: "checkmark.small")
let result = UIImageView(image: image)
return result
}()
// MARK: - Inits
init() {
super.init(frame: .zero)
setupView()
}
required init?(coder: NSCoder) {
return nil
}
// MARK: - Methods
func playAnimation() {
// 1. change constraints
listLeadingConstraint.constant += (listImageView.frame.size.width * ratioMultiplier)
listTrailingConstraint.constant += (listImageView.frame.size.width * ratioMultiplier)
checkmarkLeadingConstraint.constant += (checkmarkImageView.frame.size.width * ratioMultiplier)
checkmarkTrailingConstraint.constant += (checkmarkImageView.frame.size.width * ratioMultiplier)
self.layoutIfNeeded()
// 2. animate constraints
UIView.animate(withDuration: 3.0) {
self.layoutIfNeeded()
}
}
func setupView() {
// 1. add subviews
addSubview(listImageView)
addSubview(checkmarkImageView)
// 2. add constraints
ConstraintHelper.anchor(view: checkmarkImageView, options: [.top, .bottom])
checkmarkLeadingConstraint = checkmarkImageView.leadingAnchor.constraint(equalTo: leadingAnchor)
checkmarkTrailingConstraint = checkmarkImageView.trailingAnchor.constraint(equalTo: trailingAnchor)
checkmarkLeadingConstraint.constant -= checkmarkImageView.frame.size.width * ratioMultiplier
checkmarkTrailingConstraint.constant -= checkmarkImageView.frame.size.width * ratioMultiplier
NSLayoutConstraint.activate([checkmarkLeadingConstraint, checkmarkTrailingConstraint])
ConstraintHelper.anchor(view: listImageView, options: [.top, .bottom])
listLeadingConstraint = listImageView.leadingAnchor.constraint(equalTo: leadingAnchor)
listTrailingConstraint = listImageView.trailingAnchor.constraint(equalTo: trailingAnchor)
NSLayoutConstraint.activate([listLeadingConstraint, listTrailingConstraint])
}
}
附加信息:playAnimation() 在表格视图上从 cellForRow 调用,我也尝试使用 self.superview?.layoutIfNeeded() 调用但未成功。 ConstraintHelper 调用 translatesAutoresizingMaskIntoConstraints 并且约束正常工作,所以不用担心。任何帮助都会很棒。
【问题讨论】:
标签: swift uiview nslayoutconstraint