Пробел перед разделительной линией в моем TableView

У меня вопрос о UITableView ... У меня есть UITableViewController, и я создал настраиваемую ячейку. Когда я визуализирую tableView, я вижу небольшое пустое пространство перед разделительной линией, как вы можете видеть на этом снимке экрана:

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

Почему? Это визуализация по умолчанию? Могу я что-нибудь изменить, чтобы убрать эту белую левую прокладку?


person Safari    schedule 21.10.2013    source источник
comment
Это сделано по замыслу. Взгляните на приложение iOS 7 Notes, чтобы увидеть его в своих приложениях. Согласен, раздражает :)   -  person ArtSabintsev    schedule 21.10.2013
comment
[Оцените это решение для iOS 8] [1] [1]: stackoverflow.com/a/25788003/4014757   -  person Peter DeVries    schedule 11.09.2014
comment
[Это решение будет работать на iOS 8] [1] [1]: stackoverflow.com/a/25788003/4014757   -  person Peter DeVries    schedule 11.09.2014
comment
Если вам это небезразлично, введите ошибку улучшения в репортере ошибок. Я только что сделал.   -  person David H    schedule 30.09.2014
comment
Apple только что ответила мне - это не ошибка, это большое недоразумение относительно того, как установить цвет. Цвет пикселей слева от разделителя на самом деле является частью цвета фона ячейки (НЕ cell.contentsView). Смотрите мой новый ответ.   -  person David H    schedule 06.12.2014


Ответы (8)


Начальный пробел предоставляется по умолчанию в 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];
    }
}
person Ashok    schedule 21.10.2013
comment
@ kozla13, спасибо, что указали. Теперь я обновил приведенный выше ответ для работы с недавно выпущенным iOS 8 sdk / Xcode 6. - person Ashok; 21.10.2014
comment
@Ashok нет пробела - см. Мой ответ. - person David H; 03.01.2015
comment
Это можно напрямую применить ко всей таблице, так как this self.tableView.separatorInset = UIEdgeInsetsZero; - person Chamath Jeevan; 26.04.2016
comment
Просто обратите внимание, что все решение tableView будет перемещать также заголовки разделов соответственно. - person Andreas777; 14.02.2018
comment
В Swift 5 UIEdgeInsetsZero был переименован в UIEdgeInsets.zero - person Mahendra Liya; 22.05.2020

Кроме того, вы также можете отредактировать это в построителе интерфейса (IB):

  1. Go to IB.
  2. Выберите "Просмотр таблицы".
  3. Откройте «Инспектор атрибутов» справа.
  4. Измените «Разделительные вставки» с «По умолчанию» на «Пользовательские».
  5. Измените атрибут «Влево» с 15 на 0.

Это имеет тот же эффект, что и ответ @Ashok, но не требует написания кода.

Обновление. Работает на iOS 7 и 8.

Обновление Работает на iOS 9

person michaelavila    schedule 30.05.2014
comment
Это работает в Xcode 7, iOS 9. Проголосовали за. Это гораздо более чистое решение, чем выполнение его с помощью кода. - person Suragch; 22.08.2015
comment
Это решение не работает для ячейки статического представления таблицы - person Jake Lin; 19.12.2015
comment
Это не работает. В частности, на левом поле остается 3 или 4 точки / пикселя. - person John LaBarge; 14.01.2016

Используйте приведенный ниже код, чтобы удалить нежелательные отступы в 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];
    }
}
person Anooj VM    schedule 03.11.2014
comment
Интересно, что это сработало для меня, а другие предложения - нет. - person Brad; 28.11.2014
comment
Все остальные ответы в этой теме не сработали, но этот помогает! Я думаю, чего в большинстве других требуемых ответов кода не хватает, так это того, что этот ответ setLayoutMargins даже в ячейках! :-) Ваше здоровье! - person Randika Vishman; 03.07.2016

Пробела нет! Я ввел ошибку по этому поводу, Apple просто закрыла ее как «не ошибку», но сказала мне, почему это не ошибка. Я написал простой проект, который устанавливает цвет для всех возможных представлений. в приложении. Я вижу, что цвет этих пикселей на самом деле является цветом фона самой ячейки (а не ContentView!), Как и сказала мне Apple.

Cell.contentView.backgroundColor зеленый, а цвет cell.background красный (взят с Pixie):

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

В конце концов, без разделителя cell.contentView полностью заполняет ячейку. С разделителем внизу есть промежуток в пиксель-два. Разделитель, когда он вставлен, заполняет большую часть промежутка, но при этом видны некоторые пиксели ячейки.

Тайна раскрыта!

РЕДАКТИРОВАТЬ: Кажется, что в зависимости от того, как вы настраиваете свою раскадровку, contentView.backgroundColor «теряется» или устанавливается на белый. Если вы переборщите с ним при поставке ячеек, вы сможете добиться желаемого поведения:

    let cell = tableView.dequeueReusableCellWithIdentifier("FOO", forIndexPath: indexPath) as UITableViewCell

    cell.backgroundColor = UIColor.redColor()
    cell.contentView.backgroundColor = UIColor.greenColor()
person David H    schedule 05.12.2014
comment
Испытал то же самое! что такое радар №? - person allaire; 24.01.2015
comment
Временное исправление состоит в том, чтобы поставить цвет ячейки таким же, как у contentView, который исправляет это для iphone, но по-прежнему видеть разделитель 1 пиксель в конце на ipad. - person allaire; 24.01.2015
comment
@allaire, почему ты хочешь видеть номер ошибки? В конце концов, он был закрыт как не ошибка, поскольку эти пиксели принадлежат представлению (cell.backgroundColor), которое вы контролируете. Сделайте их ясными, сделайте их того же цвета, что и представление содержимого - все на ваш выбор! - person David H; 24.01.2015
comment
по какой-то причине я также стилизовал фон ячейки в соответствии с фоном contentView, и эта белая линия все еще отображается на iPad (но не на iPhone). - person allaire; 24.01.2015
comment
@allaire, вы все время говорите, что это не работает - вы пробовали мой загруженный проект, упомянутый в моем ответе? Это проект для iPad. Я просто запустил его на своем iPad и угадаю, что - линия красная, как на снимке выше. Скачайте и попробуйте сами. поиграйте с цветами обзора. - person David H; 24.01.2015

Быстрый

cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.frame.size.width, 0)
if (cell.respondsToSelector("preservesSuperviewLayoutMargins")){
        cell.layoutMargins = UIEdgeInsetsZero
        cell.preservesSuperviewLayoutMargins = false
   }

Это сработало для меня

Спасибо

person Shanmugasundharam    schedule 25.10.2015

Это помогло мне:

cell?.layoutMargins = UIEdgeInsetsZero;
cell?.preservesSuperviewLayoutMargins = false
person lg365    schedule 18.03.2015

Для тех из вас, кто хочет сохранить UIEdgeInsetSettings в Swift и не использует раскадровки:

Раньше: (поведение по умолчанию)

Раньше, настройка по умолчанию

Добавьте следующий код:

tableView.separatorInset.right = tableView.separatorInset.left

После, реализовано

person ericgu    schedule 18.01.2015
comment
Вы не можете назначить свойство right или left в seperatorInset напрямую, а как целое - person REALFREE; 08.05.2015
comment
@REALFREE Да, вы можете - person ericgu; 08.05.2015
comment
посмотрим, сможете ли вы скомпилировать с self.tableView.separatorInset.right = 0; - person REALFREE; 08.05.2015

Вот расширение класса UITableViewCell для Swift 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
}

Надеюсь, это кому-то поможет!

Нареш.

person Naresh Reddy M    schedule 27.04.2017