UIStackView 显示/隐藏动画无法正常工作

时间:2021-05-26 10:31:26

标签: ios uikit uistackview

我正在使用 UIStackView,它包含 3 个 UIView 实例,具有固定的高度

我试图通过单击按钮来隐藏这些子视图

第一个和第二个视图使用适当的动画显示/隐藏

但最后一个视图没有动画

enter image description here

enter image description here

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
        }
        
    }
}


2 个答案:

答案 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()
    }