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