Подтвердить что ты не робот

Согласование выравнивания по левому краю пользовательских и стандартных типов UITableViewCell

Я определяю пользовательский UITableViewCell в раскадровке. Я также использую некоторые из встроенных ячеек стандартного стиля. Мне нужно установить ограничения, чтобы мои пользовательские ячейки совпадали с определенными платформой (их заголовки правильно выравниваются слева).

Я заметил, что выравнивание по левому краю ячеек изменяется между версиями iOS и запущенным устройством. Кажется, что выравнивание влево совпадает с ячейкой по умолчанию separatorInset.

Ниже приведено UITableViewCell separatorInset для нескольких устройств и версий iOS:

  • iPad на 7 - 15 баллов.
  • iPad на 8 - 20 пунктов.
  • iPhone на 7 - 15 баллов.
  • iPhone на 8 - 16 пунктов.

Другие устройства (iPhone 6+, iPad Mini) могут быть разными - я не исчерпывающе проверял.

Как бы вы могли убедиться, что пользовательские ячейки и встроенные ячейки имеют одинаковое выравнивание их меток слева?

Есть ли разумный способ получить эти настройки по умолчанию и использовать их в ограничениях автоматического макета, которые настроены в раскадровке? Как насчет кода?

4b9b3361

Ответ 1

У меня была такая же проблема, но другой ответ мне не помог, поскольку я использовал статические ячейки в UITableViewController. После нескольких пробных ошибок я наконец нашел способ решить проблему separatorInset на iPhone 6+ без единой строки кода.

enter image description here

Я просто выравниваю левый край UILabel со значением 0 [Content View (текущее расстояние = 0)] из левого поля. А также измените положение UILabel X, чтобы получить 0. (Для моего случая в Interface Builder маржа была равна 7, UILabel X = 8). Выравнивание хорошо работает на iPhone 4S, 5S, 6 и 6 +.

EDIT: это изменилось в XCode 7. Дополнительный шаг: установите "Сохранять поля надзора" соответствующей ячейки TableViewCell и ее contentView в значение ИСТИНА или проверьте ее в IB → Size Inspector. Обратитесь к ответу @tebs1200.

Надеюсь, что это поможет.

Ответ 2

Вы можете реализовать решение, предложенное Mark, исключительно в раскадровке:

  • Убедитесь, что выбрана пользовательская ячейка.

    Ячейка просмотра таблицы, выбранная в дереве вида

  • Удостоверьтесь, что в Инспекторе размеров выбрано значение "Сохранять поля надзора"

    'Сохранить поля надзора, выбранные в инспекторе размера

  • Теперь выберите представление содержимого ячейки

    введите описание изображения здесь

  • Убедитесь, что здесь также выбран Preserve Superview Margins (см. изображение на шаге 2.)

  • Выберите ярлык (или другое представление) в вашей собственной ячейке прототипа.
  • Ограничьте левый край 0 пикселей от поля.

    введите описание изображения здесь

Ответ 3

Что сработало для меня, это добавить эти 2 строки в мою собственную реализацию UITableViewCell:

self.preservesSuperviewLayoutMargins = YES;
self.contentView.preservesSuperviewLayoutMargins = YES;
// ... add test view to content view...

Затем я использовал автоматический макет с интервалом по умолчанию:

[self.contentView addConstraints:[NSLayoutConstraint 
  constraintsWithVisualFormat:@"H:|-[testView]-|" options:0 metrics:nil 
   views:@{@"testView":testLabel}]];

[self.contentView addConstraints:[NSLayoutConstraint 
  constraintsWithVisualFormat:@"V:|-[testView]-|" options:0 metrics:nil 
   views:@{@"testView":testLabel}]];

Ответ 4

В iOS8 Apple представила layoutMargins

Вы можете установить его в своем раскадровке или на своем коде просто так:

cell.layoutMargins = UIEdgeInsetsZero // change by your custom value

До этого вы должны установить preservesSuperviewLayoutMargins в НЕТ, чтобы предотвратить наследование ячейки с помощью параметров поля "Таблица"

preserveesSuperviewLayoutMargins: Логическое значение, указывающее, соответствует ли текущий вид маркам своего супервизора.

Надеюсь, это поможет вам;)