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