Почему обновляются ограничения при прокрутке UITableView? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть 2 простых UILabel, которые нужно разместить горизонтально.Один из них с правой стороны обзора, а второй с левой стороны и получает все возможное пространство.Вот мои ограничения:

    amountOfQuestions.rightAnchor.constraint(equalTo: rightAnchor, constant: -8).isActive = true
    amountOfQuestions.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true


    topicName.leftAnchor.constraint(equalTo: leftAnchor, constant: 8).isActive = true
    topicName.topAnchor.constraint(equalTo: topAnchor, constant: 8).isActive = true
    topicName.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8).isActive = true
    topicName.rightAnchor.constraint(equalTo: amountOfQuestions.leftAnchor, constant: -8).isActive = true

Кажется, что все в порядке, но когда отображается табличное представление, это выглядит так:

enter image description here

Но после того, как я несколько раз прокрутил мой стол вверх и вниз, он стал нормальным:

enter image description here

Почему моя таблица не отображается сразу, как ввторая картинка?

Решение:

amountOfQuestions.rightAnchor.constraint(equalTo: rightAnchor, constant: -8).isActive = true
    amountOfQuestions.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
    amountOfQuestions.setContentHuggingPriority(.required, for: .horizontal)
    amountOfQuestions.setContentCompressionResistancePriority(.required, for: .horizontal)

    topicName.leftAnchor.constraint(equalTo: leftAnchor, constant: 8).isActive = true
    topicName.topAnchor.constraint(equalTo: topAnchor, constant: 8).isActive = true
    topicName.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8).isActive = true
    topicName.rightAnchor.constraint(equalTo: amountOfQuestions.leftAnchor, constant: -8).isActive = true
    topicName.setContentHuggingPriority(.required, for: .horizontal)
    topicName.setContentCompressionResistancePriority(.required, for: .vertical)


    let myBottom = topicName.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8)
    myBottom.priority = UILayoutPriority(rawValue: UILayoutPriority.required.rawValue - 1)
    myBottom.isActive = true

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

1- UILabels имеют внутреннее значение содержимого, что означает, что вам не нужно указывать ширину / высоту для них, поэтому, когда вы размещаете их горизонтально следующим образом:

|- lbl1 - lbl2 - |

Это вызывает неоднозначность ограничения, поскольку для автоматического размещения необходимо знать, какую метку обрезать, когда один контент слишком велик, поэтому вам нужно установить сопротивление горизонтальному сжатию && setHuggingPriority равным lbl2 =1000

2 - Вам необходимо понизить приоритет нижнего ограничения, так как ячейка принимает фиксированную высоту в начале макета, и эта высота может конфликтовать с текущей общей высотой вертикального содержимого, поэтому ее нужно уменьшить, чтобы избежать этогоконфликт

0 голосов
/ 28 декабря 2018

Существует несколько проблем, которые могут повлиять на макет и сделать его неправильно заданным:

  1. Никогда не ограничивайте содержимое самой ячейкой.Всегда ограничивайтесь contentView ячейки, например:

    amountOfQuestions.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: -8).isActive = true
    

(убедитесь, что вы добавляете метки как подпредставления contentView, а не самой ячейки).

Если вы хотите, чтобы размер этикеток оказывал какое-либо влияние, вам необходимо правильно установить приоритеты сопротивления объему и сжатию.В противном случае макет не должен соответствовать содержанию:

// you want topic name to resize vertically to respect the content
topicName.setHuggingPriority(.required, for: .vertical)
topicName.setContentCompressionResistancePriority(.required, for: .vertical)

// you want amount of question to resize horizontally to respect the content
amountOfQuestions.setHuggingPriority(.required, for: .horizontal)
amountOfQuestions.setContentCompressionResistancePriority(.required, for: .horizontal)

Чтобы избежать конфликтов макетов во время первого макета, рекомендуется дать одному из вертикальных ограничений чуть более низкий приоритет макета:

let bottomAnchor = topicName.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -8)
bottomAnchor.priority = UILayoutPriority(rawValue: UILayoutPriority.required.rawValue - 1)
bottomAnchor.isActive = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...