Как добавить представление в NSStackView с анимацией?
В построителе интерфейса у меня есть несколько представлений (A, B, C) в NSStackView (вертикальная ориентация). Во время выполнения я динамически изменяю NSStackView, показывая или скрывая (isHidden) некоторые из этих встроенных представлений через наблюдатель свойства (willSet). Если приведенный ниже код действительно работает (представления показывают или скрывают соответственно), я не могу сделать это с анимацией.
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 ответ
У меня был неправильный подход: 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)
}
}
Надеюсь, поможет.
Джо