Согласование выравнивания по левому краю пользовательских и стандартных типов UITableViewCell
Я определяю пользовательский UITableViewCell
в раскадровке. Я также использую некоторые из встроенных ячеек стандартного стиля. Мне нужно установить ограничения, чтобы мои пользовательские ячейки совпадали с определенными платформой (их заголовки правильно выравниваются слева).
Я заметил, что выравнивание по левому краю ячеек изменяется между версиями iOS и запущенным устройством. Кажется, что выравнивание влево совпадает с ячейкой по умолчанию separatorInset
.
Ниже приведено UITableViewCell
separatorInset
для нескольких устройств и версий iOS:
- iPad на 7 - 15 баллов.
- iPad на 8 - 20 пунктов.
- iPhone на 7 - 15 баллов.
- iPhone на 8 - 16 пунктов.
Другие устройства (iPhone 6+, iPad Mini) могут быть разными - я не исчерпывающе проверял.
Как бы вы могли убедиться, что пользовательские ячейки и встроенные ячейки имеют одинаковое выравнивание их меток слева?
Есть ли разумный способ получить эти настройки по умолчанию и использовать их в ограничениях автоматического макета, которые настроены в раскадровке? Как насчет кода?
Ответы
Ответ 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: Логическое значение, указывающее, соответствует ли текущий вид маркам своего супервизора.
Надеюсь, это поможет вам;)