2

在界面生成器中,我在 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)...

有任何想法吗 ?

非常感谢你的帮助,乔

4

1 回答 1

1

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

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

希望能帮助到你。

于 2019-01-14T18:30:38.323 回答