CGAffineTransform не работает с пользовательским UIView

Я пытаюсь создать собственный класс представления, который представляет собой всплывающее окно с 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, которая вызывается при нажатии кнопки, чтобы закрыть всплывающее окно.

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

Спасибо


person Paul Jablonski    schedule 14.07.2020    source источник
comment
Вы опубликовали свою функцию animateIn, но не функцию animateOut. Вы также не показали, где вызывается animateOut.   -  person Duncan C    schedule 14.07.2020
comment
Куда вы звоните commonInit?   -  person mag_zbc    schedule 14.07.2020
comment
Извините... Я обновил вопросы с этими подробностями.   -  person Paul Jablonski    schedule 14.07.2020


Ответы (1)


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

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

let yourView = YourView(frame: someFrame)
superview.addSubview(yourView)
yourView.animateIn()
person mag_zbc    schedule 15.07.2020
comment
Я пробовал это, и это все еще не работает. Я также пытался полностью удалить анимацию и загрузить представление с исходным tranlateX на месте, но, похоже, это игнорируется. Я не могу установить начальную позицию для представления коллекции с помощью CGAffineTransform. Но это работает для анимации. - person Paul Jablonski; 15.07.2020