Когда следует переводитьAutoresizingMaskIntoConstraints в значение true?

Я прочитал документацию. Но я все еще не уверен, когда мне нужно не устанавливать его в false. В приведенном ниже коде, если я установлю его в false я вообще не увижу заголовок. Если я оставлю это как true, то все в порядке.

Следующее в иерархии отладки View выдаст предупреждение " ширина и позиция неоднозначны".

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let header = UIView()
    header.translatesAutoresizingMaskIntoConstraints = false
    header.backgroundColor = .orange
    header.heightAnchor.constraint(equalToConstant: 10).isActive = true

    return header
}

Я думал, что всякий раз, когда мне нужно что-то изменить в коде, я должен установить для translatesAutoresizingMaskIntoConstraints значение false.

Возможно, правильнее будет сказать, нужно ли вам удалить все его ограничения, затем установить для него значение false а затем добавить то, что вам нравится, и в этом случае вам нужно будет добавить ограничения для всех четырех сторон.

Однако, если вам нужно просто сохранить то, что система предоставляет вам, в этом случае это будет tableView, управляющий его положением и шириной, а затем оставьте значение true.

Это правильно?

Ответ 1

translatesAutoresizingMaskIntoConstraints должен быть установлен в false, когда:

  1. Вы создаете объект UIView -based в коде (Storyboard/NIB установит его для вас, если для файла включена функция автоматического размещения),
  2. И вы хотите использовать автоматическую компоновку для этого вида, а не рамку -based,
  3. И представление будет добавлено в иерархию представлений, которая использует автоматическое размещение.

В этом случае не все это правда. В частности, пункт 2.

После того, как вы возвращаете представление заголовка из viewForHeaderInSection оно добавляется в табличное представление, и его frame устанавливается на основе текущей ширины табличного представления и высоты, которую вы возвращаете из heightForHeaderInSection.

Вы можете добавить подпредставления в представление корневого заголовка (header в вашем коде) и использовать ограничения для размещения этих подпредставлений относительно представления заголовка.

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

Чтобы иметь динамический размер заголовка, вам нужно добавить подпредставления в ваше представление header и добавить ограничения между этими подпредставлениями и header. Затем автоматическое размещение может использовать собственный размер содержимого header для определения размера представления header.

Поскольку вы не ограничиваете рамку header, не устанавливайте для translatesAutoresizingMaskIntoConstraints значение false. Вам нужно убедиться, что у вас есть достаточные ограничения на ваши подпредставления для автоматического размещения, чтобы определить размер header.

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

Любые подпредставления, которые вы добавляете в header действительно требуют для translatesAutoresizingMaskIntoConstraints значения false

Вам также нужно вернуть что-то из estimatedHeightForHeaderInSection - чем ближе к вашей фактической высоте заголовка, тем лучше - если вы используете tableview.sectionHeaderHeight = UITableViewAutomaticDimension

Ответ 2

  • Для программно созданного представления по умолчанию установлено значение true, а для представлений из Interface Builder по умолчанию установлено значение false

    Если свойство имеет (или установлено) значение True, система автоматически создает набор ограничений на основе фрейма представлений и маски авторазмера. И если вы добавите свои собственные ограничения, они неизбежно вступят в конфликт с автоматически сгенерированными ограничениями. Это создает неудовлетворительный макет. Поэтому при программной реализации представлений обязательно установите для их свойства translatesAutoresizingMaskIntoConstraints значение NO.