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

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

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

image for extra separator lines in UITableView

вопрос задан 2.09.2009
RoundOutTooSoon
3955 репутация

31 ответов


  • 1363 рейтинг

    Конструктор интерфейсов (iOS 9+)

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

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

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

    enter image description here


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

    Swift

    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, с репутацией 6268, 21.03.2011
  • 125 рейтинг

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

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

    - (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, e. г. [UIColor redColor]. Если вы не видите красных полос внизу таблицы, значит, ваш нижний колонтитул не установлен.

    ответ дан wkw, с репутацией 3709, 24.11.2009
  • 53 рейтинг

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

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.yourTableview.tableFooterView = UIView()
    }
    
    ответ дан dineshthamburu, с репутацией 771, 29.10.2014
  • 36 рейтинг

    Я хотел бы продлить 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 снова :)

    ответ дан Guntis Treulands, с репутацией 4676, 24.03.2012
  • 21 рейтинг

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

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

    ответ дан Kyle Clegg, с репутацией 28249, 18.03.2014
  • 17 рейтинг

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

    - (void) viewDidLoad
    {
      [super viewDidLoad];
    
      // Without ARC
      //self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];
    
      // With ARC, tried on Xcode 5
      self.tableView.tableFooterView = [UIView new];
    }
    
    ответ дан Ambili B Menon, с репутацией 949, 16.11.2012
  • 10 рейтинг

    для Swift:

        override func viewDidLoad() {
            super.viewDidLoad()
            tableView.tableFooterView = UIView()
        }
    
    ответ дан Sebastian, с репутацией 6070, 25.07.2015
  • 6 рейтинг

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

    tableView.tableFooterView = UIView()
    

    enter image description here

    Существует лучший подход: добавьте линию в 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
    

    enter image description here

    ответ дан Darko, с репутацией 4853, 16.03.2017
  • 6 рейтинг

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

    override func viewDidLoad() {
        super.viewDidLoad()
    
        //...
    
        // Remove extra separators
        tableView.tableFooterView = UIView(frame: CGRectZero)
    }
    
    ответ дан Babatunde Adeyemi, с репутацией 12156, 12.04.2015
  • 6 рейтинг

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

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

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

    ответ дан Or Shanoon, с репутацией 665, 6.11.2014
  • 5 рейтинг

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

    tableView.tableFooterView = UIView()
    
    ответ дан roy, с репутацией 3060, 1.05.2017
  • 4 рейтинг

    Я знаю, что на этот вопрос принят ответ, но я изложил здесь различные способы, как скрыть дополнительную разделительную линию 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, с репутацией 32933, 12.09.2013
  • 4 рейтинг

    uitableview дополнительные разделительные линии скрыть дополнительные разделительные линии скрыть в swift 3. 0

     self.tbltableView.tableFooterView = UIView(frame: .zero)
    
    ответ дан Parth Changela , с репутацией 945, 12.10.2016
  • 4 рейтинг

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

    ответ дан Casebash, с репутацией 47027, 14.01.2010
  • 3 рейтинг

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

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

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

    ответ дан maaalex, с репутацией 236, 25.04.2012
  • 2 рейтинг

    SWIFT 3. 0 прекрасно работает с tableView.tableFooterView = UIView()

    ответ дан Marcelo Gracietti, с репутацией 1782, 22.12.2016
  • 2 рейтинг

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

    tableView. sectionFooterHeight = 0. е;

    tableView. sectionHeaderHeight = 0. е;

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

    ответ дан Kalpesh Panchasara, с репутацией 897, 17.04.2017
  • 2 рейтинг

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

    В вашем UITableViewDelegate:

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return .leastNormalMagnitude
    }
    
    ответ дан Cœur, с репутацией 15941, 14.03.2017
  • 1 рейтинг

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

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
        return 0.1;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
    {
        return 0.1;
    }
    
    ответ дан Hari c, с репутацией 626, 15.04.2017
  • 1 рейтинг

    Swift 4. 0 Расширение

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

    enter image description here

    extension UITableView {
        @IBInspectable
        var hideSeparatorForEmptyCells: Bool {
            set {
                tableFooterView = newValue ? UIView() : nil
            }
            get {
                return tableFooterView == nil
            }
        }
    }
    
    ответ дан Nik Kov, с репутацией 2580, 19.02.2018
  • 1 рейтинг

    Мне посчастливилось реализовать один фрагмент принятого ответа (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, с репутацией 446, 29.03.2016
  • 0 рейтинг

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

    TableView Grouped

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

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

    ответ дан Gefilte Fish, с репутацией 348, 31.10.2017
  • 0 рейтинг

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

    extension UITableView {
         func removeExtraCells() {
             tableFooterView = UIView(frame: .zero)
         }
    }
    
    ответ дан Suresh Varma, с репутацией 9018, 26.09.2018
  • 0 рейтинг

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

    controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];
    
    ответ дан user3900346, с репутацией 96, 23.06.2016
  • 0 рейтинг

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

    tableView.tableFooterView = UIView()
    
    ответ дан iMuzahid, с репутацией 2274, 19.03.2018
  • 0 рейтинг

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

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

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

    ответ дан Alix, с репутацией 2014, 19.03.2018
  • 0 рейтинг

    Попробуйте это

    self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
    
    ответ дан vishnu, с репутацией 530, 5.03.2015
  • 0 рейтинг

    В Swift (я использую 4. 0), вы можете сделать это, создав собственный класс UITableViewCell и переопределив метод setSelected. Затем разделитель вставляет все в 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)
    }
    
    ответ дан chillbumps, с репутацией 21, 4.05.2018
  • -1 рейтинг

    Я просто добавил эту строку в функцию ViewDidLoad, и проблема исправлена.

    tableView.tableFooterView = [[UIView alloc] init]; 
    
    ответ дан teapeng, с репутацией 1013, 28.02.2017
  • -1 рейтинг

    , если вы подклассифицируете UITableView, вам нужно сделать это. , ,

    -(void)didMoveToSuperview {
        [super didMoveToSuperview];
        self.tableFooterView = [UIView new];
    }
    
    ответ дан Todd Vanderlin, с репутацией 9, 27.03.2016
  • -1 рейтинг

    Swift 3 / Swift 4, Очень простой и простой способ

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
          //MARK:- For Hiding the extra lines in table view.
        tableView?.tableFooterView = UIView()
    }
    

    ИЛИ

    override func viewDidLoad(_ animated: Bool) {
        super.viewDidLoad(animated)
          //MARK:- For Hiding the extra lines in table view.
        tableView?.tableFooterView = UIView()
    }
    
    ответ дан Shakeel Ahmed, с репутацией 530, 11.04.2018