Изменение размера анимации с помощью автоматического макета и "прыгающих" колец

Я работаю над приложением MacOS, которое использует автоматическое расположение в иерархии представлений с представлениями на основе слоев. Приложение использует NSStackView с несколькими подпредставлениями, каждое из которых имеет кнопку свертывания / разворачивания, чтобы изменить размер соответствующего подпредставления. Изменение размера подпредставлений осуществляется путем добавления и удаления ограничений макета, а для анимации изменения размера используется контекст анимации. Я реализовал это, как показано на WWDC 2013, сессия 213, начиная примерно с минуты 29:

@objc func disclosureToggeled(_ sender : Any) {
    if isCollapsed {
        self.addConstraint(collapseConstraint)
    }
    else {
        self.removeConstraint(collapseConstraint)
    }

    NSAnimationContext.runAnimationGroup({ context in
        context.allowsImplicitAnimation = true
        self.window?.layoutIfNeeded()
    })
}

Анимация изменения размера работает как положено.

Моя проблема: если я запускаю анимацию изменения размера, и подпредставление, содержащее фокусированный элемент пользовательского интерфейса, анимируется в новую позицию, его кольцо фокусировки немедленно переходит со своего начала в конечное положение, в то время как сам элемент пользовательского интерфейса анимируется правильно.

Есть идеи, что я делаю не так?

0 ответов

Я считаю, что это связано с проблемой, которая обсуждается в том же видео (изменение размера окна). Решения, также обсуждаемые в видео,

  1. Анимируйте константу ограничения (а не добавляйте / удаляйте ограничение) явно через constraint.animator.constant аксессор или
  2. Отдельно анимируйте сначала рассматриваемое ограничение, затем оконную рамку, сохраняя приоритет ограничения ниже приоритета изменения размера окна, чтобы анимация ограничения не изменяла размер окна.

Я обнаружил, что подход 1 проще, если изменения ограничений можно описать простыми постоянными изменениями.

Другие вопросы по тегам