swift - 如何在带有动画的 NSStackView 中添加 View ?

标签 swift macos animation nsview nsstackview

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

  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) 无关...

有什么想法吗?

非常感谢你的帮助,乔

最佳答案

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

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

希望对您有所帮助。

关于swift - 如何在带有动画的 NSStackView 中添加 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53884438/

相关文章:

ios - 设置重复本地通知的日期

python - 在 osx 10.11 中安装 wxPython

xcode - 如何通过 xcodeproj 在 Xcode 中构建 vlc 项目

javascript - 为什么这个圆没有围绕正确的中心旋转?

jquery 和 css : page content loading animation

ios - UITableView beginUpdates() 和 endUpdates() 说明

ios - 快速播放和停止音乐

jquery - 将页面滚动连接到动画涉及哪些 jquery/css 方法和属性?

ios - 单元格上的自定义表格 View 滚动问题

macos - 命令在 macOS 终端中未执行,为什么?