我正在使用 UIStackView,它包含 3 个 UIView 实例,具有固定的高度
我试图通过单击按钮来隐藏这些子视图
第一个和第二个视图使用适当的动画显示/隐藏
但最后一个视图没有动画
class ViewController: UIViewController {
private var flag: Bool = true
@IBOutlet weak var targetView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func buttonDidTapped(_ sender: Any) {
flag = !flag
UIView.animate(withDuration: 0.5) {
self.view.layoutIfNeeded()
self.targetView.isHidden = !self.flag
}
}
}
答案 0 :(得分:0)
尝试更改您的代码:
UIView.animate(withDuration: 0.5) {
self.view.layoutIfNeeded()
self.targetView.isHidden = !self.flag
}
到:
self.targetView.isHidden = !self.flag
UIView.animate(withDuration: 0.5) {
self.view.layoutIfNeeded()
}
看起来您在更改之前制作了动画。
答案 1 :(得分:0)
问题在于隐藏排列的子视图时堆栈视图更改其框架的方式。
查看正在发生的事情的最简单方法:
Alpha: 0.5
.isHidden
您会看到 50% 半透明的绿色视图“滑过”蓝色视图……蓝色视图在动画过程中不会“高度缩小”。
要解决您的特定问题,请将堆栈视图上的 Clips To Bounds
设置为 true
。现在,当您在绿色视图上切换 .isHidden
时,动画看起来是正确的。
如果您有半透明视图,这不会改变“滑过”的外观,但这是一个不同的问题。
作为旁注,您可以简化代码并像这样去掉 flag
:
UIView.animate(withDuration: 0.5) {
// not needed
//self.view.layoutIfNeeded()
self.targetView.isHidden.toggle()
}