Изменение размера анимации с помощью автоматического макета и "прыгающих" колец
Я работаю над приложением 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 ответов
Я считаю, что это связано с проблемой, которая обсуждается в том же видео (изменение размера окна). Решения, также обсуждаемые в видео,
- Анимируйте константу ограничения (а не добавляйте / удаляйте ограничение) явно через
constraint.animator.constant
аксессор или - Отдельно анимируйте сначала рассматриваемое ограничение, затем оконную рамку, сохраняя приоритет ограничения ниже приоритета изменения размера окна, чтобы анимация ограничения не изменяла размер окна.
Я обнаружил, что подход 1 проще, если изменения ограничений можно описать простыми постоянными изменениями.