Как добавить представление в NSStackView с анимацией? - PullRequest
0 голосов
/ 21 декабря 2018

В построителе интерфейсов у меня есть несколько видов (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 Ответ

0 голосов
/ 14 января 2019

У меня был неправильный подход: 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)   
    }
}

Надеюсь, это поможет.

Джо

...