我的情况:
我有一个包含StackView的水平滚动视图。在这个StackView中有一些视图,可以展开/折叠。
当我想展开其中一个视图时,我首先取消隐藏视图中的一些子视图。之后,我需要根据此视图的新高度更改ScrollView的高度。
但这不起作用。。。
我尝试这个代码:
UIView.animate(withDuration: 0.3) { [self] in
// Toggle hight of all subViews
stackView.arrangedSubviews.forEach { itemView in
guard let itemView = itemView as? MyView else { return }
itemView.toggleView()
}
// Now update the hight of the StackView
// But here the hight is always from the previous toggle
let height = self.stackView.arrangedSubviews.map {$0.frame.size.height}.max() ?? 0.0
print(height)
heightConstraint.constant = height
}
这段代码很好地设置了动画,但总是达到错误的高度。因此,ScrollView在应该展开时设置为折叠动画,在应该折叠时设置为展开动画。
有人知道如何解决这个问题吗?
问题是,无论你在这里做什么:
itemView.toggleView()
可能已经做了一些改变视图高度的事情,但随后您立即致电:
let height = self.stackView.arrangedSubviews.map {$0.frame.size.height}.max() ?? 0.0
UIKit更新帧之前。
因此,您可以跟踪自己的高度属性,或者。。。
在更新后获取帧高度,例如:
DispatchQueue.main.async {
let height = self.stackView.arrangedSubviews.map {$0.frame.size.height}.max() ?? 0.0
print("h", height)
self.scrollHeightConstraint.constant = height
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}