Як встановити повну ширину роздільника в UITableView


149

У мене є місце, UITableViewде роздільники не мають повної ширини. Він закінчується як 10 пікселів перед лівою стороною. Я грав із цим кодом у viewDidLoad().

self.tableView.layoutMargins = UIEdgeInsetsZero;

Також у дошці розкадрування, коли ви можете вибрати спеціальні або стандартні селектори. Тепер усі заселені комірки не мають селекторів повної ширини, але порожні комірки мають повну ширину.

Як я можу це виправити?


9
UITableViewмає властивість separatorInset. Встановити UITableViewроздільник рядків на нуль. Крім того, ви можете змінити separatorInsetз розкадровки
KRUKUSA

Відповіді:


220

Це працювало для мене на пристроях iOS 8.4 - 9.0, що використовують Xcode 6.4 та Swift 1.2:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

Оновлення Swift 5:

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero

Чому це видаляє мій стіл із порожнім? Сеператори зворушені, але я не бачу жодної моєї кнопки
Оскар

1
@James, чи можете ви пояснити, "видалити мій стіл із порожнім?". Як ви додали свої кнопки (через IB, код)?
MB_iOSDeveloper

1
Дуже приємне рішення. Але в моєму випадку я ставлю код прямо до ініціалізації комірки, оскільки я хотів мати повну ширину роздільника у всіх контролерах.
Войта

Якщо це не очевидно, це також працює для Objective-C з правильними змінами курсу синтаксису.
cohenadair

1
Жодне з цих рішень не працює на iPad. Це працює лише на iPhone ...
Чарльз Робертсон

103

Я отримав відповідь з цього допису: iOS 8 UITableView роздільник вставки 0 не працює

Просто додайте цей код у свій UITableViewController

-(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];
    }
}

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
}

2
для мене працює лише додавання методу делегата
tableView

Мені шкода, що я не зрозумів. Ви маєте на увазі, що вам достатньо було додати TableViewDeleagte ?. Я просто спробував лише додати, що це не спрацювало для мене @TonyTony
Timo Cengiz

3
для мене метод viewDidLayoutSubviewsне потрібен
TonyTony

Ви намагаєтеся запустити свій код з іншими версіями IOS, ніж 8? Можливо, це працює для найновіших. Інакше добре для вас, що це працює. Я спробував просто додати метод делегата tableview, і це не допомогло. @TonyTony
Timo Cengiz

Довелося використовувати обоє. Я намагався використовувати кожен окремо, не маючи успіху. Це працювало лише тоді, коли я використовував обидва. Крім того, я спробував це, коли мій контролер перегляду був підкласом UITableViewController, і коли це був підклас UIViewController. Без різниці. Зауважте, що я працюю в тренажері 8.1.
Рон

100

У вашому UITableViewCell

Перейдіть до інспектора атрибутів у вашому інтерфейсі та просто змініть "15" на 0. Зробіть це для всіх комірок, які ви хочете змінити.

постріли

Можливо, вам доведеться додати [cell setLayoutMargins:UIEdgeInsetsZero];до свогоtableViewCell


1
Або це дивно. Це працювало для мене (дякую!) На рядках, де я мав відображатись UITableViewCells, але на будь-яких порожніх рядках під ними роздільник все ще був відступним на 15 пікселів.
Майк Гледхілл

Якщо ви використовуєте статичні комірки, все, що вам потрібно, - це змінити ліву вставку на 0, як описано на зображенні (Робота в iOS 10, Xcode 8.3.1)
Ignacio Valdivieso

29

для Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}

20
  1. Виберіть свій UITableViewCell
  2. Перейдіть до програми " Інспектор"
  3. Перейдіть у роздільник та змініть його на "власні вставки"
  4. Встановити leftта / або rightполя. (За замовчуванням left: 15, right: 0)

Подивіться, як це працює (використовуючи left: 100):

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

Результат:

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


1
дублікат попередньої відповіді від @Hannah Луїза Керні
Костянтин Салаватов

19

Я успадковую UITableViewControllerі потребую додаткових налаштувань для двох вставок, willDisplayCellщоб також встановити preservesSuperviewLayoutMarginsзначення false. У Swift це виглядає приблизно так:

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }
}

Не потрібно встановлювати, preservesSuperviewLayoutMargins = falseоскільки значення за замовчуванням вже помилкове
crubio

2
Зверніть увагу, що це не налаштовує роздільники на клітинки "заповнення", що відображаються контролером, щоб заповнити подання нижче ваших комірок, якщо клітини не складають повну висоту.
Тієм

11

Сепаратор Insetза замовчуванням 15 зліва. Змініть Insetпараметр роздільника з autoна customі встановіть вкладку на 0.

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


9

Для Swift в iOS 9+

Якщо використовується спеціальний UITableViewCell:

override var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set(newVal) {}
}

то для вашого UITableViewв viewDidLoad:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;

Це єдина відповідь, яка мене виправила (оновлено до швидкого 3). Однак ... це працює, коли в комірці є дані. Для порожніх комірок, які ще не заповнені (і, мабуть, ще не назвали цю переосмислену змінну layoutMargins), розділювач все ще не заповнює повну ширину моєї спеціальної комірки в таблиці. Будь-які ідеї з цього приводу?
RanLearns

На iPhone сепаратор закінчується лише декількома пікселями зліва та декількома пікселями праворуч на порожніх осередках. Це виглядає нормально, не використовуючи цей трюк, щоб нульове обмеження. У iPad справжня проблема - роздільники порожньої комірки йдуть від лівого краю столового огляду, лише приблизно 80% від ширини комірки. Коли в комірці є дані, розділювач все ще становить 80% ширини комірки, але він починає 20% шляху і проходить аж до правого краю табличного огляду
RanLearns

1
Ми розібралися з рішенням ... використовуючи, якщо #available (iOS 9, *) {self.tableView.cellLayoutMarginsFollowReadableWidth = false} зробив це так, що мені взагалі не потрібен ваш код на iPhone. Сепаратор просто йде на повну ширину. На iPad порожні комірки мають роздільник повної ширини, але мені потрібен ваш код, щоб зберегти повну ширину, коли дані додаються. В іншому випадку додано кілька пікселів зліва, де немає роздільника, коли дані заповнюють комірку.
RanLearns

1
Відповідь , де я отримав код в коментарі вище від: stackoverflow.com/a/31538250/428981
RanLearns

9

Для людей, які мають проблеми з iPad - це призведе до того, що ви перебуваєте в такому ж стані, як у iPhone. Потім можна відрегулювати за separatorInsetпотребою.

tableView.cellLayoutMarginsFollowReadableWidth = false

Це була моя проблема в iOS 10 проти iOS 11. iOS 11 було чудово, але 10 мали різний запас. Дякую!!!
migs647

9

Використовуйте його в cellForRowAtIndexPathметоді, щоб налаштувати характеристики сепаратора клітинок,
він ідеально підходить для iOS9.0 +

 cell.separatorInset = UIEdgeInsetsZero;
 cell.layoutMargins = UIEdgeInsetsZero;
 cell.preservesSuperviewLayoutMargins = NO;

8

Тестовано для iOS 9.3 та Swift 2.2. Обов’язково введіть кодwillDisplayCell який викликається безпосередньо перед відображенням комірки, а не cellForRowAtIndexPathтам, де ви створюєте комірку.

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero
}

Додайте overrideдо функції для UITableViewController, наприклад:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

5

Ніщо з перерахованого вище не працювало для мене у Swift 2.2 та Xcode 7.3.1

Виявилося, найпростіше рішення з усіх. Код не потрібен. Просто змініть TableViewCellзначення індексу макета у UITableViewінспектора:


4

Для Swift 3:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
}

1

В viewDidLoad(перевірено iOS11 - швидкий 4.1)

спробуйте

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)


0

Жодне з цих рішень не працює на iPad, але я придумав рішення, яке охоплює обидва пристрої:

З клітинами для багаторазового використання:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

З клітинами, які не використовуються повторно:

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

Просто для розширення цього підходу:

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

Обидві властивості можуть використовувати UITableView& UITableViewCell. Останнє насправді є властивістю UIView, яке є батьківським класом обох UITableView& UITableViewCell.


1
Єдине ефективне рішення, яке я знайшов для клітин, які не використовуються повторно,
Міккі

0

швидкий 5, оновлення Xcode 11

розмістити це всередині viewDidLoad ()

yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

для роздільника від краю до краю просто встановіть значення зліва і справа на 0.

до речі змініть "yourTableView" на ім'я Outlet tableView.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.