Устранить лишние разделители ниже UITableView

715

Когда я настраиваю табличное представление с 4 строками, под заполненными строками все еще остаются дополнительные разделительные линии (или дополнительные пустые ячейки).

Как бы я удалил эти клетки?

изображение для дополнительных разделительных линий в UITableView

RoundOutTooSoon
источник

Ответы:

1506

Интерфейсный конструктор (iOS 9+)

Просто перетащите UIView на стол. В раскадровке он будет располагаться вверху под вашими пользовательскими ячейками. Вы можете предпочесть название «нижний колонтитул».

Здесь это показано зеленым для ясности, вы, вероятно, захотите чистый цвет.

Обратите внимание, что, регулируя высоту, вы можете по своему усмотрению влиять на то, как обрабатывается «нижний отскок» таблицы. (Высота ноль обычно в порядке).

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


Чтобы сделать это программно:

стриж

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.tableFooterView = UIView()
}

Objective-C

iOS 6.1+

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [UIView new];
}

или, если вы предпочитаете,

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

Исторически в iOS:

Добавьте к контроллеру табличного представления ...

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
     // This will create a "invisible" footer
     return CGFLOAT_MIN;
 }

и при необходимости ...

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{        
    return [UIView new];

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}
J. Costa
источник
Я думаю, что ваши описания и ваш код поменялись местами. В любом случае, это отлично сработало для меня. Я использую только «настоящие» нижние колонтитулы со сгруппированными таблицами, поэтому я добавил if (tableView.style! = UITableViewStyleGrouped) {} ​​вокруг вашего кода. Теперь все мои не сгруппированные таблицы теряют свои дополнительные ячейки, в то время как мои сгруппированные таблицы не затрагиваются.
arlomedia
Следуя моему примечанию выше, я добавлю предупреждение, что если вы поместите какие-либо условия в метод viewForFooterInSection, убедитесь, что метод возвращает либо UIView, либо nil. Если вы случайно вернете void, ваше приложение упадет!
arlomedia
4
@Mathieu Это будет работать, потому что если таблица имеет собственный нижний колонтитул, она не будет создавать строки "fantom" для заполнения табличного представления. Таким образом, вы создадите пустой вид, который будет использоваться в качестве нижнего колонтитула, и установите высоту около 0 (она не может быть нулевой, или iOS не будет отображать ее). С помощью этого простого трюка вы измените поведение по умолчанию.
Дж. Коста
2
@ j.Costa: Ваше решение будет работать только один раз при создании uitableview. после нажатия на последнюю ячейку ваше решение не будет более хорошим. пожалуйста, улучшите свой ответ.
3
Использование tableFooterViewоставляет разделитель в последней ячейке в строке, так как таблица все еще ожидает содержимое ниже этой ячейки. Использование исторического способа устранит этот последний разделитель и в целом выглядит лучше.
Джеймс Куанг
128

Вот еще один способ сделать это без сгруппированного стиля таблицы, и вы, вероятно, не догадаетесь. Добавление верхнего и нижнего колонтитула к таблице (возможно, одного или другого достаточно, еще не проверено) приводит к исчезновению разделителей из строк-заполнителей / пустых строк.

Я наткнулся на это, потому что я хотел немного места сверху и снизу столов, чтобы уменьшить риск нажатия кнопок вместо ячейки стола с мясистыми пальцами. Вот метод для вставки пустого представления в качестве верхнего и нижнего колонтитула. Используйте любую высоту, какую захотите, вы все равно уберете лишние разделительные линии.

- (void) addHeaderAndFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.myTableView setTableHeaderView:v];
    [self.myTableView setTableFooterView:v];
    [v release];
}

В ответ на @Casebash я вернулся к коду в своем приложении (менеджер списков «AcmeLists» в магазине iTunes ...) и коротко замкнул метод addHeaderAndFooter для проверки. Без этого у меня есть дополнительные разделители строк; с кодом, у меня есть то, что вы видите в этом окне оснастки: нет таблицы разделителей строк изображения . Поэтому я не уверен, почему это не сработало бы для вас. Более того, для меня имеет смысл, что наличие любого пользовательского нижнего колонтитула в табличном представлении обязательно должно прекратить рисовать разделители строк для пустых строк под ним. Это было бы отвратительно. Для справки я посмотрел таблицы, в которых было больше строк, чем можно было увидеть на экране, а затем таблицу с двумя строками. В обоих случаях нет посторонних разделителей.

Возможно, ваши собственные представления не были добавлены. Для того, чтобы проверить , что установить цвет фона на нечто иное , чем clearColor, например, [UIColor redColor]. Если вы не видите красных полос внизу таблицы, значит, ваш нижний колонтитул не установлен.

WKW
источник
1
Вы можете сделать это и в IB. Просто перетащите UIView внизу TableView и установите высоту 1.
Ortwin Gentz
70

Удаление лишних разделительных линий для пустых строк в UITableView в Swift

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}
dineshthamburu
источник
34

Я хотел бы расширить ответ WKW :

Простое добавление только нижнего колонтитула с высотой 0 добьется цели. (проверено на SDK 4.2, 4.4.1)

- (void) addFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectZero];

    [self.myTableView setTableFooterView:v];
}

или даже проще - где вы настраиваете свое табличное представление, добавьте эту строку:

//change height value if extra space is needed at the bottom.
[_tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)]];

или даже проще - просто удалить любые разделители:

[_tableView setTableFooterView:[UIView new]];

Спасибо WKW снова :)

Гунтис Треуландс
источник
Это правильный ответ, потому что в других методах последний ряд остается без разделителя строк
Ankush
22

Для iOS 7+ с использованием раскадровок

Просто перетащите UIViewв UITableViewнижний колонтитул. Установите высоту нижнего колонтитула в 0.

Кайл Клегг
источник
18

Попробуй это. Это сработало для меня:

- (void) viewDidLoad
{
  [super viewDidLoad];

  // Without ARC
  //self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];

  // With ARC, tried on Xcode 5
  self.tableView.tableFooterView = [UIView new];
}
Амбили Б Менон
источник
14

Для Свифта:

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableFooterView = UIView()
    }
Себастьян
источник
11

Если вы используете Swift, добавьте следующий код в viewDidLoad контроллера, который управляет табличным представлением:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView()
}
Бабатунде Адейеми
источник
8

Вы можете просто добавить пустой нижний колонтитул в конце, тогда он будет скрывать пустые ячейки, но это также будет выглядеть довольно некрасиво:

tableView.tableFooterView = UIView()

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

Есть лучший подход: добавьте линию в 1 точку в конце табличного представления, поскольку нижний колонтитул и пустые ячейки также больше не будут отображаться.

let footerView = UIView()
footerView.frame = CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1)
footerView.backgroundColor = tableView.separatorColor
tableView.tableFooterView = footerView

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

Дарко
источник
Очень хороший ввод, однако нет необходимости делать вашу последнюю ячейку с толстым цветом разделителя внизу, вместо этого просто сделайте для нее тот же цвет фона ячейки, и он тоже исчезнет.
Густаво Байокки Коста
Однако вы предпочитаете. Но я думаю, что своего рода «незавершенный» разделитель выглядит довольно некрасиво.
Дарко
7

просто добавьте этот код ( Swift ). ,

tableView.tableFooterView = UIView()
Рой
источник
1
Дубликат многих ответов, включая главный ответ вики и ответ Себастьяна
Cœur
7

Продвижение решения J. Costa: вы можете внести глобальные изменения в таблицу, добавив следующую строку кода:

[[UITableView appearance] setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];

внутри первого возможного метода (обычно в AppDelegate, в: application:didFinishLaunchingWithOptions:метод).

o.shnn
источник
2
Будьте осторожны с этим, есть случаи, когда ваш предполагаемый нижний колонтитул может быть изменен, и вы проведете день или два, подвергая сомнению свое здравомыслие. Кроме того, tableFooterView не помечен UI_APPEARANCE_SELECTOR, поэтому реальное поведение может измениться в любое время.
Мрайт
6

Я знаю, что этот вопрос был принят ответ, но я привел здесь различные способы, как скрыть дополнительную разделительную линию UITableView .

Вы можете скрыть tableViewстандартную разделительную линию и добавить свою собственную строку вверху каждой ячейки.

Обновить:

Самый простой способ добавить пользовательский разделитель - добавить простую UIViewвысоту 1px:

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
separatorLineView.backgroundColor = [UIColor grayColor]; /// may be here is clearColor;
[cell.contentView addSubview:separatorLineView];

ИЛИ

    self.tblView=[[UITableView alloc] initWithFrame:CGRectMake(0,0,320,370) style:UITableViewStylePlain];
    self.tblView.delegate=self;
    self.tblView.dataSource=self;
    [self.view addSubview:self.tblView];

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.tblView setTableHeaderView:v];
    [self.tblView setTableFooterView:v];
    [v release];

ИЛИ

- (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // This will create a "invisible" footer
    return 0.01f;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    // To "clear" the footer view
    return [[UIView new] autorelease];
}

ИЛИ Лучший и простой способ, который мне нравится, это

self.tableView.tableFooterView = [[UIView alloc] init];

Попробуйте любой из них;

iPatel
источник
6

Вы можете найти много ответов на этот вопрос. Большинство из них связаны с манипуляциями с атрибутом UITableView's', tableFooterViewи это правильный способ скрыть пустые строки. Для удобства я создал простое расширение, которое позволяет включать / выключать пустые строки из Interface Builder. Вы можете проверить его из этого GIST файла. Я надеюсь, что это может сэкономить немного вашего времени.

extension UITableView {

  @IBInspectable
  var isEmptyRowsHidden: Bool {
        get {
          return tableFooterView != nil
        }
        set {
          if newValue {
              tableFooterView = UIView(frame: .zero)
          } else {
              tableFooterView = nil
          }
       }
    }
}

Применение:

tableView.isEmptyRowsHidden = true

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

Станислав Барановский
источник
5

uitableview дополнительные разделительные линии скрыть дополнительные разделительные линии скрыть в Swift 3.0

 self.tbltableView.tableFooterView = UIView(frame: .zero)
Parth Changela
источник
5

Если вам не нужен какой-либо разделитель после последней ячейки, тогда вам нужна близкая к нулю, но ненулевая высота для нижнего колонтитула.

В вашем UITableViewDelegate:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}
Кер
источник
1
великолепно! Работал для меня!
Энтони Рафель
5

Swift прекрасно работает с:

tableView.tableFooterView = UIView()
Марсело Грасиетти
источник
3

Просто добавьте представление с желаемым цветом разделителя в качестве цвета фона, шириной 100%, высотой 1px в позиции x0 y-1 к вашему tableViewCell. Убедитесь, что tableViewCell не обрезает подпредставления, вместо этого tableView должен.

Таким образом, вы получаете абсолютно простой и работающий разделитель только между существующими ячейками без какого-либо взлома кода или IB.

Примечание. На вертикальной отскок вверху отображается первый разделитель, но это не должно быть проблемой, потому что это поведение iOS по умолчанию.

maaalex
источник
3

Я использовал табличное представление, чтобы показать фиксированное количество строк с фиксированной высотой, поэтому я просто изменил его размер и сделал его недоступным для прокрутки.

Casebash
источник
3

Чтобы программно удалить лишние разделительные линии из нижней части UItableview, просто запишите следующие две строки кода, и он удалит из него дополнительный разделитель.

tableView.sectionFooterHeight = 0.f;
tableView.sectionHeaderHeight = 0.f;

Этот трюк работает на меня все время, попробуйте сами.

Калпеш Панчасара
источник
2

Мне посчастливилось реализовать один фрагмент принятого ответа (iOS 9+, Swift 2.2). Я пытался реализовать:

self.tableView.tableFooterView = UIView(frame: .zero)

Тем не менее, это не повлияло на мое tableView- я думаю, что это может иметь какое-то отношение к тому, что я использовал UITableViewController.

Вместо этого мне пришлось только переопределить viewForFooterInSectionметод (я не устанавливал в tableFooterViewдругом месте):

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return UIView(frame: .zero)
}

Это работало нормально для tableViewодного раздела (если у вас есть несколько разделов, вам нужно указать последний).

BAP
источник
2

Если у вас есть только один раздел, то самый быстрый и простой способ - просто установить стиль представления таблицы с «Обычный» на «Сгруппированный». (см. изображение)

TableView сгруппированы

Если у вас есть больше разделов, вам может потребоваться установить нулевую высоту заголовка (в зависимости от вкуса вашего / вашего клиента / вашего руководителя проекта)

Если у вас есть больше разделов, и вы не хотите связываться с заголовками (даже если в простейшем случае это всего лишь одна строка), вам нужно установить UIView в качестве нижнего колонтитула, как это было объяснено в предыдущих ответах)

Гефилте Фиш
источник
2

Расширение Swift 4.0

Просто небольшое расширение для раскадровки:

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

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}
Ник Ков
источник
2

Быстрый и легкий Swift 4 way.

override func viewDidLoad() {
     tableView.tableFooterView = UIView(frame: .zero)
}

Если у вас есть статические клетки. Вы также можете отключить разделитель из окна инспектора. (это не будет желательно, если вам нужен разделитель. В этом случае используйте метод, показанный выше) окно инспектора

Alix
источник
На установку нового UIView для tableFooterView уже отвечали 10 раз, с лучшими объяснениями относительно того, почему, лучший код (вы пропустили super.viewDidLoad()), и он включен в вики-ответ сверху. Что касается удаления всех разделителей, то в действительности это не тот вопрос, поэтому лучше откатить последнее изменение и / или полностью удалить свой ответ.
Cœur
1

Если вы хотите удалить ненужное место в UITableview, вы можете использовать ниже два метода

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}
Хари с
источник
1

Я добавил это небольшое расширение таблицы, которое помогает во всем

extension UITableView {
     func removeExtraCells() {
         tableFooterView = UIView(frame: .zero)
     }
}
Суреш Варма
источник
1

Попробуй с этим

для цели C

- (void)viewDidLoad 
 {
  [super viewDidLoad];
  // This will remove extra separators from tableview
  self.yourTableView.tableFooterView = [UIView new];
}

для Свифта

override func viewDidLoad() {
 super.viewDidLoad()
 self.yourTableView.tableFooterView = UIView()
}
Атану Мондал
источник
0

Попробуй это

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
Вишну
источник
0

UIKitне создает пустую ячейку, когда tableViewимеет tableFooterView. Таким образом, мы можем сделать трюк и назначить объект нулевой высоты UIViewкак нижний колонтитул tableView.

tableView.tableFooterView = UIView()
iMuzahid
источник
0

В случае , если у вас есть searchbarв вашем view(чтобы ограничить количество результатов, например), вы должны добавить следующее в shouldReloadTableForSearchStringиshouldReloadTableForSearchScope:

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];
user3900346
источник
0

В Swift (я использую 4.0), вы можете сделать это путем создания пользовательского UITableViewCellкласса, а также overridingна setSelectedметод. Тогда separator insetsвсе к 0 . (мой основной класс с табличным представлением имеет четкий фон) цвет.

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // eliminate extra separators below UITableView
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
hoptown
источник