如何在带有动画的NSStackView中添加视图?

时间:2018-12-21 11:58:18

标签: swift macos animation nsview nsstackview

在界面生成器中,我在NSStackView(垂直方向)中有几个视图(A,B,C)。 在运行时,我通过属性观察器(willSet)显示或隐藏(isHidden)一些嵌入式视图来动态更改NSStackView。如果下面的代码确实有效(视图会相应显示或隐藏),那么我就无法通过动画来做到这一点。

  var isExpanded :Bool = false {
        willSet {
            NSAnimationContext.beginGrouping()
            NSAnimationContext.current.duration = 2.0
            if newValue {
                viewA.isHidden = true
                viewB.isHidden = false
                viewC.isHidden = true
                viewD.isHidden = true
                print("Popover expanded")
            } else {
                viewA.isHidden = false
                viewB.isHidden = false
                viewC.isHidden = false
                viewD.isHidden = false
                print("Popover contracted")
            }
            NSAnimationContext.endGrouping()
        }

据我了解,动画不处理isHidden状态,但我找不到其他方法来实现。 另外,我还尝试使用addView和removeFromSuperview方法(而不是隐藏/显示)。结果相同...

我的问题是我主要发现与iOS有关的问题(UIView.animate ...),而没有发现有关MacOS(NSView)的问题...

有什么想法吗?

非常感谢您的帮助,乔

1 个答案:

答案 0 :(得分:0)

我使用了错误的方法:isHidden不是正确的方法(无法设置离散值的动画-是否隐藏)。 相反,我对视图的高度添加了约束 在viewController中将约束作为IBOutlet连接。使用此代码,该视图在stackView中的其他两个视图之间平滑地挤压。 :-)

@IBOutlet weak var constraint: NSLayoutConstraint!

@IBAction func toggle(_ sender: NSButton) {
    if constraint.constant == 0 {
        NSAnimationContext.runAnimationGroup({context in
            context.duration = 0.25
            context.allowsImplicitAnimation = true
            constraint.constant = 80
            self.view.layoutSubtreeIfNeeded()
        }, completionHandler: nil)

    } else {

        NSAnimationContext.runAnimationGroup({context in
            context.duration = 0.25
            context.allowsImplicitAnimation = true
            constraint.constant = 0
            self.view.layoutSubtreeIfNeeded()
        }, completionHandler: nil)   
    }
}

希望有帮助。