У меня есть две коллекции IBOutlet
, где один список содержит ограничения, для которых установлены значения отступа, а другой - где все значения установлены на 0. В Интерфейсном Разработчике установлен первый набор ограничений и второй комплект не установлен.
На основе содержимого, полученного с сервера, ограничения либо сохраняются как есть, либо первый набор деактивируется, а второй набор активируется.
Теперь это обычно работает нормально, но я обнаружил, что бывают случаи, когда активация не применяется немедленно, особенно внутри экземпляра UICollectionViewCell
.
Когда ячейки загружаются впервые, изменения не применяются, но когда я прокручиваю до некоторых других ячеек и возвращаюсь, изменения применяются.
Есть ли документация по этому непоследовательному поведению?
Ниже приведен код активации / деактивации ограничений:
textConstSet.forEach { $0.isActive = false }
imageConstSet.forEach { $0.isActive = true }
Вывод на консоль после запуска этого кода:
(lldb) po cell.imageConstSet
▿ Optional<Array<NSLayoutConstraint>>
▿ some : 4 elements
- 0 : <NSLayoutConstraint:0x60000223f890 V:|-(0)-[UIStackView:0x7f8ada588f30] (active, names: '|':UIView:0x7f8ada588d50 )>
- 1 : <NSLayoutConstraint:0x60000223f8e0 V:[UIStackView:0x7f8ada588f30]-(0)-| (active, names: '|':UIView:0x7f8ada588d50 )>
- 2 : <NSLayoutConstraint:0x60000223f930 H:[UIStackView:0x7f8ada588f30]-(0)-| (active, names: '|':UIView:0x7f8ada588d50 )>
- 3 : <NSLayoutConstraint:0x60000223f980 UIView:0x7f8ada588760.width == 0 (active)>
(lldb) po cell.textConstSet
▿ Optional<Array<NSLayoutConstraint>>
▿ some : 4 elements
- 0 : <NSLayoutConstraint:0x600002212990 V:[UIStackView:0x7f8ada588f30]-(8)-| (inactive, names: '|':UIView:0x7f8ada588d50 )>
- 1 : <NSLayoutConstraint:0x6000022129e0 V:|-(8)-[UIStackView:0x7f8ada588f30] (inactive, names: '|':UIView:0x7f8ada588d50 )>
- 2 : <NSLayoutConstraint:0x600002212a30 H:[UIStackView:0x7f8ada588f30]-(12)-| (inactive, names: '|':UIView:0x7f8ada588d50 )>
- 3 : <NSLayoutConstraint:0x6000022126c0 UIView:0x7f8ada588760.width == 12 (inactive)>
Кроме того, звонок layoutIfNeeded()
ничего не делает. Изменения применяются, но при их отображении они отменяются.