Анимация ограничения высоты «прыжки» - PullRequest
1 голос
/ 28 апреля 2020

Я создаю свой собственный подкласс UIControl для использования в моей настройке iDunnoU . Я закончил UIControl, за исключением анимации расширения / свертывания. Проблема с этой анимацией заключается в том, что она «прыгает» вниз / вверх при развертывании / свертывании, а не плавно разворачивается, как мой оригинальный макет (см. Ниже).

Я загрузил код в репозиторий GitHub, нашел здесь . Код для добавления элемента управления в суперпредставление можно найти здесь , код для настройки ограничения высоты можно найти здесь , а код для анимации ограничения высоты можно найти здесь .

Mockup iDunnoUMenuButton

1 Ответ

2 голосов
/ 29 апреля 2020

UIView.animate() может быть немного сложнее - вам нужно позвонить .layoutIfNeeded() при правильном просмотре.

Замените ваш isExpanded / didSet в iDUMenuButton классе следующим:

var isExpanded = false {
    didSet {
        if isExpanded != oldValue {
            if isExpanded {
                becomeFirstResponder()
                let haptics = UIImpactFeedbackGenerator(style: .rigid)
                haptics.impactOccurred()
            }
            guard let sv = self.superview else {
                // shouldn't happen, but let's be thorough
                fatalError("Self must have a superview!!!")
            }
            // not needed
            //self.layoutIfNeeded()
            UIView.animate(withDuration: 0.3) {
                self.heightConstraint.isActive = !self.isExpanded

                // call .layoutIfNeeded() on self's superview
                //self.layoutIfNeeded()
                sv.layoutIfNeeded()

                self.layer.shadowOpacity = self.isExpanded ? 1 : 0
                self.buttons.forEach { $0.setBadgeHidden(hidden: !self.isExpanded, animated: true) }
            }
            delegate?.menuButton(self, isExpandedDidUpdate: isExpanded)
        }
    }
}
...