Как установить полную ширину разделителя в 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
MB_iOSDeveloper
источник
Почему это удаляет мою таблицу с пустой? Сепараторы перемещены, но я не вижу ни одной из своих кнопок
Оскар,
1
@ Джеймс, не могли бы вы объяснить, «удалить мою таблицу с пустой?». Как вы добавили свои кнопки (через 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
Тимо Ченгиз
3
мне метод viewDidLayoutSubviewsне нужен
TonyTony
Вы пытались запустить свой код с другими версиями IOS, кроме 8? Может быть, это работает для самых новых. В противном случае хорошо для вас, что это работает. Я попытался просто добавить метод делегата tableview, и это не помогло. @TonyTony
Тимо Ченгиз
Я должен был использовать оба. Я пытался использовать каждый в отдельности, но безуспешно. Это работало только когда я использовал оба. Кроме того, я попробовал это, когда мой контроллер представления был подклассом UITableViewController, и когда это был подкласс UIViewController. Нет разницы. Обратите внимание, что я работаю в симуляторе 8.1.
Рон
100

В твоем UITableViewCell

Перейдите к Инспектору атрибутов в Интерфейсном Разработчике и просто измените «15» на 0. Сделайте это для всех ячеек, которые вы хотите изменить.

instets

Возможно, вам придется добавить [cell setLayoutMargins:UIEdgeInsetsZero];в свойtableViewCell

HannahCarney
источник
1
Или это странно. Это сработало для меня (спасибо!) В строках, где я должен был отображать UITableViewCells, но в любых пустых строках под ними разделитель все еще имел отступ в 15 пикселей.
Майк Гледхилл
Если вы используете статические ячейки, все, что вам нужно, это изменить левую вставку на 0, как описано на рисунке (Работа в iOS 10, Xcode 8.3.1)
Игнасио Вальдивьесо,
29

для Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}
Wilson
источник
21
  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
    }
}
H6.
источник
Вам не нужно устанавливать, 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;
Кристофер Ларсен
источник
Это единственный ответ, который исправил это для меня (обновлено до swift 3). Однако ... это работает, когда в ячейке есть данные. Для пустых ячеек, которые еще не были заполнены (и я думаю, что они не вызывали эту переопределенную переменную layoutMargins), разделитель по-прежнему не заполняет всю ширину моей пользовательской ячейки в табличном представлении. Есть идеи по этому поводу?
RanLearns
На iPhone разделитель заканчивается только несколькими пикселями слева и несколькими пикселями справа на пустых ячейках. Это выглядит хорошо без использования этого трюка, чтобы обнулить поля. На iPad реальная проблема - разделители на пустой ячейке идут от левого края таблицы, всего около 80% ширины ячейки. Когда в ячейке есть данные, разделитель по-прежнему составляет 80% ширины ячейки, но он начинается на 20% пути и проходит до правого края
табличного представления
1
Выяснили решение ... используя if #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) {
oyalhi
источник
5

Ничто из вышеперечисленного не работает для меня в Swift 2.2 и Xcode 7.3.1

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

aurawindsurfing
источник
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 - swift 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

swift 5, обновление Xcode 11

поместите это внутри viewDidLoad ()

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

для разделителя от края до края просто установите значение слева и справа равным 0.

Кстати, измените «yourTableView» на имя вашего выхода tableView.

Developersian
источник