Пробел перед разделительной линией в мой TableView
У меня вопрос о UITableView...
У меня есть UITableViewController, и я создал пользовательскую ячейку.
Когда я визуализирую tableView, я вижу небольшое пробел перед линией разделителя, как вы можете видеть на этом скриншоте:
![enter image description here]()
Почему? Это визуализация по умолчанию?
Могу ли я что-то изменить, чтобы удалить это белое левое заполнение?
Ответы
Ответ 1
Ведущие пробелы предоставляются по умолчанию в iOS 7, даже для пользовательских ячеек.
Оформить это свойство separatorInset
UITableviewCell для удаления/добавления белого интервала в обоих концах разделителя строк ячейки.
//Удаление пробела
cell.separatorInset = UIEdgeInsetsZero;
В качестве альтернативы, на уровне UITableView вы можете использовать это свойство -
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) { // Safety check for below iOS 7
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
Обновление - Ниже код работает на iOS 7 и iOS 8:
-(void)viewDidLayoutSubviews
{
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Ответ 2
В качестве альтернативы вы также можете редактировать это в построителе интерфейса (IB):
- Перейдите к IB.
- Выберите "Просмотр таблицы".
- Откройте "Attribute Inspector" справа.
- Измените "Вставки разделителя" по умолчанию на "Пользовательский".
- Измените атрибут "Left" с 15 на 0.
Это имеет тот же эффект, что и @Ashok, но не требует написания кода.
Обновление Работает на iOS 7 и 8
Обновление Работает на iOS 9
Ответ 3
Используйте код ниже, чтобы удалить ненужное дополнение в UITableView. Он работает как на IOS 8, так и на 7
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
{
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setLayoutMargins:)])
{
[tableView setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)])
{
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Ответ 4
Нет пробела! Я вошел в эту ошибку, Apple просто закрыла ее как "не ошибку", но сказала мне, почему ее не ошибка. Я написал простой проект, который устанавливает цвет для каждого возможного вида в приложении. Я вижу, что цвет этих пикселей на самом деле является цветом фона самой ячейки (а не содержимогоView!), Как и сказал мне Apple.
Cell.contentView.backgroundColor зеленый, а цвет cell.background - красный (используется с Pixie):
![enter image description here]()
В конце концов, без разделителя, cell.contentView полностью заполняет ячейку. С разделителем в нижней части находится пиксель или два зазора. Сепаратор, когда вставка, заполняет большую часть зазора, но есть некоторые пиксели ячейки, показывающие через.
Тайна решена!
EDIT: Кажется, что в зависимости от того, как вы настраиваете свою раскадровку, contentView.backgroundColor получает "потерянный" или установлен на белый. Если вы будете ездить на нем при поставке ячеек, вы можете получить свое поведение:
let cell = tableView.dequeueReusableCellWithIdentifier("FOO", forIndexPath: indexPath) as UITableViewCell
cell.backgroundColor = UIColor.redColor()
cell.contentView.backgroundColor = UIColor.greenColor()
Ответ 5
Swift
cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.frame.size.width, 0)
if (cell.respondsToSelector("preservesSuperviewLayoutMargins")){
cell.layoutMargins = UIEdgeInsetsZero
cell.preservesSuperviewLayoutMargins = false
}
Это работало для меня
Спасибо
Ответ 6
Это сделало трюк для меня:
cell?.layoutMargins = UIEdgeInsetsZero;
cell?.preservesSuperviewLayoutMargins = false
Ответ 7
Для тех из вас, кто хочет сохранить UIEdgeInsetSettings в Swift и не использует раскадровки:
До: (Поведение по умолчанию)
![Before, Default Setting]()
Добавьте следующий код:
tableView.separatorInset.right = tableView.separatorInset.left
![After, Implemented]()
Ответ 8
Вот расширение для UITableViewCell Class для быстрых 3 и более поздних версий
extension UITableViewCell
{
func removeSeparatorLeftPadding() -> Void
{
if self.responds(to: #selector(setter: separatorInset)) // Safety check
{
self.separatorInset = UIEdgeInsets.zero
}
if self.responds(to: #selector(setter: layoutMargins)) // Safety check
{
self.layoutMargins = UIEdgeInsets.zero
}
}
}
Использование:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "menuCellID")!
// .. Your other code
cell.removeSeparatorLeftPadding()
return cell
}
Надеюсь, это поможет кому-то!
Naresh.