Анимированное масштабирование UIView с вложенными UIViews - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь анимировать UIView, заполняя весь экран. У меня есть UILabel внутри этого UIView, который имеет некоторые NSLayoutConstraints. При анимации ограничений ширины и высоты UIView ограничения UILabel не обновляются. Я установил ограничение ширины метки на ширину привязки UIView, и вызвал layoutIfNeeded () в блоке UIView.animate. Это не имеет ничего общего с ограничениями метки.

Затем я решил также анимировать ограничения метки, поэтому теперь я анимирую ширину метки до той же ширины, что и UIView и верхняя часть ярлык до 25. Это работает, за исключением того факта, что ярлык исчезает при запуске анимации и около 75% просто летит с правой стороны? Я понятия не имею, почему это происходит. Любая помощь будет оценена.

Код анимации:

guard let cell = collectionView.cellForItem(at: indexPath) as? NeuralNetLayerCollectionCell else {
            return
        }

        let expandingCellView = SlideOverView(frame: cell.bounds)
        expandingCellView.center = collectionView.convert(cell.center, to: self)
        expandingCellView.textLabel.text = cell.textLabel.text
        self.addSubview(expandingCellView)

        expandingCellView.widthConstraint.constant = self.frame.width
        expandingCellView.heightConstraint.constant = self.frame.height
        expandingCellView.labelWidthConstraint.constant = self.frame.width
        expandingCellView.labelTopConstraint.constant = 25

        UIView.animate(withDuration: 5, animations: {
            expandingCellView.center = self.center
            expandingCellView.layoutIfNeeded()
        })

И ограничения:

var widthConstraint: NSLayoutConstraint!
    var heightConstraint: NSLayoutConstraint!
    var labelWidthConstraint: NSLayoutConstraint!
    var labelTopConstraint: NSLayoutConstraint!

self.translatesAutoresizingMaskIntoConstraints = false

        widthConstraint = NSLayoutConstraint(item: self, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0, constant: self.bounds.width)
        heightConstraint = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0, constant: self.bounds.height)

        self.backgroundColor = .white
        self.layer.cornerRadius = 25

        textLabel.textAlignment = .center
        textLabel.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(textLabel)
        labelTopConstraint = textLabel.topAnchor.constraint(equalTo: self.topAnchor, constant: 25)
        let labelLeftConstraint = textLabel.leftAnchor.constraint(equalTo: self.leftAnchor)
        labelWidthConstraint = textLabel.widthAnchor.constraint(equalToConstant: self.bounds.width)
        let heightConstraintLabel = textLabel.heightAnchor.constraint(equalToConstant: 50)
        NSLayoutConstraint.activate([labelTopConstraint, labelLeftConstraint, labelWidthConstraint, heightConstraintLabel, widthConstraint, heightConstraint])

Видео о том, что происходит в настоящее время: https://streamable.com/rk3ah По сути, я хочу, чтобы число 2 двигалось вверх по мере увеличения вида, вместо того, чтобы исчезать и затем лететь с правой стороны. Это то, на что это похоже, когда я удаляю весь другой код, и просто имею простое представление, которое оживляет как другой. Этикетка все еще ведет себя странно. Я хочу, чтобы ярлык был виден в течение всей анимации. https://streamable.com/jaqu6

1 Ответ

0 голосов
/ 11 марта 2020

размеры ячеек collectionView обычно контролируются collectionView:layout:sizeForItemAtIndexPath: ( документами )

Так что, если это так в вашей ситуации (не может быть уверенно без дополнительного контекста), вам нужно

  1. Создать invalidationContext для ячейки, размер которой необходимо изменить ( do c)
  2. Передать этот invalidationContext в Layout потока ( do c)
  3. Это вызывает collectionView:layout:sizeForItemAtIndexPath: вызов, и там вам нужно вернуть новый размер вашей ячейки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...