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

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

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

enter image description here

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

4b9b3361

Ответ 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.