Неисправность, сдерживающая анимацию подпредставления в анимационном блоке - PullRequest
0 голосов
/ 24 марта 2020

Зачем ограничивать подпредставление от анимации? Почему бы просто не выполнить изменения макета после анимации?

Это логично, но невозможно, учитывая мою иерархию представлений и этот конкретный вариант использования.

Моя иерархия представлений:

MyViewController: UIViewController -> MyCustomView: UIView -> MyCustomScrollView: UIScrollView, UIScrollViewDelegate, UICollectionViewDelegate, UICollectionViewDataSource

Почему это невозможно?:

1) Я делаю это в MyViewController после различных изменения ограничения:

UIView.animate(withDuration: 0.3, animations: {
    self.view.layoutIfNeeded()
}) 

2) Поскольку MyCustomView - это подпредставление, которое содержит MyCustomScrollView (, которое, в свою очередь, содержит UICollectionView в качестве подпредставления ), обновление макета запускается CV willDisplay делегированный метод, при котором я добавляю кучу меток в MyCustomView, если быть точным.

Вот функция в MyCustomView, которую я вызываю:

func addLabel(forIndexPath indexPath: IndexPath) {

    var label: UILabel!
    label.frame = Util.labelFrame(forIndex: indexPath, fillWidth: false) // The frame for the label is generated here!

    //Will assign text and font to the label which are unnecessary to this context

    self.anotherSubView.addSubview(label) //Add the label to MyCustomView's subview
}

3) Так как эти изменения попадают в блок анимации из пункта 1, я получаю некоторые ненужные, нежелательные анимации, происходящие , И так, изменение макета MyCustomView связано с этим блоком анимации, заставляя меня искать способ, чтобы предотвратить это

То, что пытались до сих пор:

1) Попробовал обернуть addSubView() из addLabel(forIndexPath:) внутри UIView.performWithoutAnimation {} блока. - Не повезло

2) Попытка обернуть addSubView() из addLabel(forIndexPath:) внутри другого блока анимации с 0,0 секундным временем, чтобы увидеть, переопределяет ли это родительский блок анимации - Не повезло

3 ) Исследовано UIView.setAnimationsEnabled(enabled:), но, похоже, это не отменит / приостановит существующие аниматоры и полностью отключит все анимации , если true (это не то, что я хочу)

Подводя итог, моя проблема заключается в следующем:

Мне нужно ограничить анимацию в MyCustomView, но мне нужны все остальные изменения макета. Это вообще возможно? Буду очень признателен за подсказку или решение, TYIA!

1 Ответ

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

Благодаря этому ответу, удалив все анимации из слоя anotherSubview (внутри addLabel(forIndexPath:)) после добавления метки:

self.anotherSubview.addSubview(label)
self.anotherSubview.layer.removeAllAnimations() //Doing this removes the animations queued to animate the label's frame into the view

делает именно то, что я хочет!

...