iOS 8 UITableView: separator inset не работает, как исправить?
Решение проблемы с separator inset на iOS 8
Проблема, с которой вы столкнулись, действительно распространена на iOS 8. Дело в том, что в этой версии iOS свойство separatorInset работает не так, как в более поздних версиях. Даже если вы установите его в .zero, UITableView может игнорировать это значение из-за внутренних настроек системы. Вот проверенное решение, которое работает на iOS 8 и выше.
Шаг 1: Настройка таблицы
Убедитесь, что вы устанавливаете separatorInset после загрузки таблицы, например, в viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
tableView.separatorInset = .zero
tableView.layoutMargins = .zero
}
Шаг 2: Настройка ячеек
Самое важное — переопределить свойства в самой ячейке. Создайте подкласс UITableViewCell и переопределите layoutSubviews и awakeFromNib (если используете storyboard):
class CustomCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
self.separatorInset = .zero
self.layoutMargins = .zero
}
override func layoutSubviews() {
super.layoutSubviews()
self.separatorInset = .zero
self.layoutMargins = .zero
}
}
Шаг 3: Настройка в делегате
Также обязательно реализуйте метод делегата tableView(_:willDisplay:forRowAt:) в вашем контроллере:
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.separatorInset = .zero
cell.layoutMargins = .zero
}
Почему это работает?
На iOS 8 UITableView использует layoutMargins для вычисления отступов разделителей. Если вы просто установите separatorInset на таблице, ячейки могут не унаследовать это значение. Переопределение в willDisplay гарантирует, что каждая ячейка получит нужные настройки перед отображением. Дополнительно, вызов layoutSubviews в ячейке переопределяет возможные системные изменения.
Дополнительный совет для iOS 8
Если вы используете storyboard, проверьте, что в инспекторе атрибутов ячейки свойство Separator установлено в Default или Single Line, а Inset — в Custom со значением 0. Иногда визуальный редактор может переопределять код.
- Убедитесь, что вы не используете
UITableViewStyle.grouped— в нём отступы могут быть фиксированными. - Попробуйте также установить
tableView.cellLayoutMarginsFollowReadableWidth = false(доступно с iOS 9, но на iOS 8 игнорируется). - Если ничего не помогает, проверьте, нет ли у вас глобальных настроек через
UIAppearance, которые могут влиять на ячейки.
После применения этих шагов разделители должны идти от края до края. Если проблема остаётся, перезагрузите таблицу вызовом tableView.reloadData().
Альтернативный подход: использование preserverSuperviewLayoutMargins
Ещё один способ решить проблему на iOS 8 — отключить наследование layoutMargins у ячейки. Добавьте в подкласс ячейки:
class CustomCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
self.preservesSuperviewLayoutMargins = false
self.separatorInset = .zero
self.layoutMargins = .zero
}
}
Свойство preservesSuperviewLayoutMargins (доступно с iOS 8) указывает, должна ли ячейка учитывать отступы родительского представления (UITableView). Установка в false заставляет ячейку игнорировать системные отступы таблицы.
Дополнение для Swift
Если вы не хотите создавать подкласс, можно настроить ячейку прямо в методе cellForRowAt:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = .zero
cell.layoutMargins = .zero
return cell
}
Этот подход менее надёжен, так как настройки могут сброситься при переиспользовании ячейки, но для простых случаев он работает. Комбинируйте с willDisplay для гарантии.
Ответов пока нет.
Войдите чтобы оставить ответ