CGAffineTransform не работает с пользовательским UIView - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь создать настраиваемый класс представления, который представляет собой всплывающее окно с UICollectionView на нем. Я создал функции для анимации представления и вывода, но на самом деле работает только функция анимации вывода.

Я устанавливаю следующие ограничения ...

override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()
}

func commonInit(){
    ...
    self.addSubview(collectionView)
    collectionView.bottomAnchor.constraint(equalTo: self.safeAreaLayoutGuide.bottomAnchor).isActive = true
    collectionView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
    collectionView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
    collectionView.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.7).isActive = true
    ...
    self.animateIn()
}

Затем, чтобы обрабатывать анимацию, которую я использую следующим образом ...

func animateIn(){
    self.collectionView.transform = CGAffineTransform(translationX: 0, y: self.collectionView.frame.height)
    self.blurredBackgroundView.alpha = 0      
    UIView.animate(withDuration: 0.5, animations: {
        self.blurredBackgroundView.alpha = 1
        self.collectionView.transform = .identity

    })
}

И функция animateOut (которая работает) ...

func animateOut(){
    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1, options: .curveEaseIn, animations: {
        self.collectionView.transform = CGAffineTransform(translationX: 0, y: self.collectionView.frame.height)
        self.blurredBackgroundView.alpha = 0
    }) { (complete) in
        if complete {
            self.removeFromSuperview()
        }
    }
}

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

Кто-нибудь может сказать мне, что я делаю не так? Я чувствую, что должно быть что-то основное. c Мне не хватает.

Спасибо

1 Ответ

0 голосов
/ 15 июля 2020

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

Что вам нужно сделать, так это вызвать вашу функцию animateIn явно после того, как представление было добавлено в иерархию представлений

let yourView = YourView(frame: someFrame)
superview.addSubview(yourView)
yourView.animateIn()
...