Зачем ограничивать подпредставление от анимации? Почему бы просто не внести изменения в макет после анимации?
Это логично, но неосуществимо, учитывая мою иерархию представлений и этот конкретный вариант использования.
Моя иерархия представлений:
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!