Бяло пространство преди разделителна линия в моя TableView

Имам въпрос относно UITableView... Имам UITableViewController и създадох персонализирана клетка. Когато визуализирам tableView, виждам малко бяло пространство преди разделителната линия, както можете да видите на тази екранна снимка:

въведете описание на изображението тук

Защо? Визуализация по подразбиране ли е? Мога ли да променя нещо, за да премахна тази бяла лява подложка?


person Safari    schedule 21.10.2013    source източник
comment
Това е направено по дизайн. Разгледайте приложението Бележки за iOS 7, за да го видите в техните приложения. Съгласен съм, че е досадно :)   -  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
Това може да се приложи директно към цялата таблица като този 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. Променете „Разделителни вмъквания“ от Default на Custom.
  5. Променете атрибута "Left" от 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 точки/px пространство в лявото поле. - 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 току-що го затвори като „не е грешка“, но ми каза защо не е грешка. Написах прост проект, който задава цвят за всеки възможен изглед в приложението. Това, което виждам е, че цветът на тези пиксели всъщност е цветът на фона на самата клетка (а не contentsView!), точно както Apple ми каза.

Cell.contentView.backgroundColor е зелен, а cell.background цветът е червен (направен с Pixie):

въведете описание на изображението тук

В крайна сметка, без разделител, cell.contentView запълва клетката изцяло. При разделител има един или два пиксела празнина в долната част. Разделителят, когато е вмъкнат, запълва по-голямата част от празнината, но след това има някои пиксели от клетката, които се виждат.

Мистерията е разрешена!

РЕДАКТИРАНЕ: Изглежда, че в зависимост от това как конфигурирате вашия Storyboard, 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
Temp fix е да поставите цвета на клетката същия като 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 и не използват Storyboards:

Преди: (Поведение по подразбиране)

Преди, настройка по подразбиране

Добавете следния код:

tableView.separatorInset.right = tableView.separatorInset.left

След, внедрено

person ericgu    schedule 18.01.2015
comment
Не можете да присвоите дясно или ляво свойство в 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 Class за 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