Активация ios NSLayoutConstraint не применяется сразу внутри UICollectionViewCell - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть две коллекции 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() ничего не делает. Изменения применяются, но при их отображении они отменяются.

...