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

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

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

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

33 ответа

Решение

Интерфейсный конструктор (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];
}

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

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

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

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

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}

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

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

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

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

- (void) viewDidLoad
{
  [super viewDidLoad];

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

  // With ARC, tried on Xcode 5
  self.tableView.tableFooterView = [UIView new];
}

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

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView(frame: CGRectZero)
}

Для Свифта:

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

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

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

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

tableView.tableFooterView = UIView()

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

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

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

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

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

extension UITableView {

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

Использование:

tableView.isEmptyRowsHidden = true

Я знаю, что этот вопрос был принят ответ, но я привел здесь различные способы, как скрыть дополнительную разделительную линию 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];

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

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

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

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

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

В вашем UITableViewDelegate:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

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

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

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

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

tableView.sectionFooterHeight = 0.f;

tableView.sectionHeaderHeight = 0.f;

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

Мне посчастливилось реализовать один фрагмент принятого ответа (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 с одним разделом (если у вас есть несколько разделов, вам нужно указать последний).

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

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

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}

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

для цели 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()
}

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

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

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

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

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

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

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

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

extension UITableView {
     func removeExtraCells() {
         tableFooterView = UIView(frame: .zero)
     }
}

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()
}

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

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}

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

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];

Детали: Swift 3, Xcode: 8.1

Код

extension UITableView {

    var emptyCellsEnabled: Bool {
        set(newValue) {
            if newValue {
                tableFooterView = nil
            } else {
                tableFooterView = UIView()
            }

        }
        get {
            if tableFooterView == nil {
                return true
            }
            return false
        }
    }
}

использование

// hide empty cells
tableView.emptyCellsEnabled = false

// show empty cells
tableView.emptyCellsEnabled = true

Полный пример

ViewController.swift

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var footerSwitchButton: UIButton!

    var emptyCellsEnabled: Bool {
        get {
            return tableView.emptyCellsEnabled
        }

        set (newValue) {
            if newValue {
                footerSwitchButton.setTitle("Hide", for: .normal)
            } else {
                footerSwitchButton.setTitle("Show", for: .normal)
            }

            tableView.emptyCellsEnabled = newValue
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = "\(indexPath)"
        return cell
    }

    @IBAction func buttonAction(_ sender: Any) {
        emptyCellsEnabled = !emptyCellsEnabled
    }
}

extension UITableView {

    var emptyCellsEnabled: Bool {
        set(newValue) {
            if newValue {
                tableFooterView = nil
            } else {
                tableFooterView = UIView()
            }

        }
        get {
            if tableFooterView == nil {
                return true
            }
            return false
        }
    }
}

Main.storyboard

<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11542" systemVersion="16B2555" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="ABN-e6-xZB">
    <device id="retina4_7" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11524"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="tne-QT-ifu">
            <objects>
                <viewController id="BYZ-38-t0r" customClass="ViewController" customModule="stackru_1633966" customModuleProvider="target" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="Vun-mi-5Wc">
                                <rect key="frame" x="0.0" y="64" width="375" height="603"/>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                            </tableView>
                        </subviews>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstItem="Vun-mi-5Wc" firstAttribute="top" secondItem="y3c-jy-aDJ" secondAttribute="bottom" id="9Pj-Wl-qW6"/>
                            <constraint firstItem="Vun-mi-5Wc" firstAttribute="bottom" secondItem="wfy-db-euE" secondAttribute="top" id="KIO-bu-Dz6"/>
                            <constraint firstItem="Vun-mi-5Wc" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="gJl-YJ-vQY"/>
                            <constraint firstAttribute="trailing" secondItem="Vun-mi-5Wc" secondAttribute="trailing" id="gef-yl-Rvt"/>
                        </constraints>
                    </view>
                    <navigationItem key="navigationItem" id="tH2-D6-JJL">
                        <barButtonItem key="rightBarButtonItem" style="plain" id="ROj-kP-cCC">
                            <button key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="0C7-jC-HjH">
                                <rect key="frame" x="276" y="7" width="83" height="30"/>
                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                                <state key="normal" title="Button"/>
                                <connections>
                                    <action selector="buttonAction:" destination="BYZ-38-t0r" eventType="touchUpInside" id="d6H-00-Yww"/>
                                </connections>
                            </button>
                        </barButtonItem>
                    </navigationItem>
                    <connections>
                        <outlet property="footerSwitchButton" destination="0C7-jC-HjH" id="EgU-Vx-Skx"/>
                        <outlet property="tableView" destination="Vun-mi-5Wc" id="OHe-J2-y4A"/>
                    </connections>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="1072.8" y="137.18140929535232"/>
        </scene>
        <!--Navigation Controller-->
        <scene sceneID="xgG-0P-k1k">
            <objects>
                <navigationController automaticallyAdjustsScrollViewInsets="NO" id="ABN-e6-xZB" sceneMemberID="viewController">
                    <toolbarItems/>
                    <navigationBar key="navigationBar" contentMode="scaleToFill" id="xS4-8G-RJU">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
                        <autoresizingMask key="autoresizingMask"/>
                    </navigationBar>
                    <nil name="viewControllers"/>
                    <connections>
                        <segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="JET-Cj-BFP"/>
                    </connections>
                </navigationController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="Bh9-fJ-Nrf" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="133.59999999999999" y="137.18140929535232"/>
        </scene>
    </scenes>
</document>

Результат

Попробуй это

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
Другие вопросы по тегам