Проблема с ограничением анимации подпредставления в блоке анимации

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

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

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

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:), но похоже, что это не отменит/приостановит существующие аниматоры и полностью отключит все анимации, если это правда (чего я не хочу)

Подводя итог, моя проблема такова:

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


person Lokesh SN    schedule 24.03.2020    source источник


Ответы (1)


Благодаря этому ответу, удалению всех анимаций из слоя 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

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

person Lokesh SN    schedule 24.03.2020