Устраните дополнительные разделители ниже UITableView

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

Как я могу удалить эти ячейки?

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

Ответ 1

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

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

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

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

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


Сделать это программно:

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

- (void) viewDidLoad
{
  [super viewDidLoad];

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

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

Ответ 7

Для Swift:

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

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

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

override func viewDidLoad() {
    super.viewDidLoad()

    //...

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

Ответ 11

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

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

Обновление:

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

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

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

Ответ 12

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

tableView.tableFooterView = UIView()

Ответ 13

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

Ответ 14

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

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

Ответ 15

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

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

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

Ответ 16

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

tableView.tableFooterView = UIView()

Ответ 17

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

В UITableViewDelegate:

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

Ответ 18

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

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

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

Ответ 19

Вы можете найти много ответов на этот вопрос. Большинство из них tableFooterView с манипуляциями с атрибутом UITableView 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

enter image description here

Ответ 20

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

Ответ 21

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

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

Ответ 22

Если у вас есть только один раздел, самым быстрым и простым способом является просто установить стиль Table View с "Plain" на "Grouped". (см. изображение)

TableView Grouped

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

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

Ответ 23

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

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

enter image description here

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

Ответ 24

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

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

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

Ответ 25

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

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];

Ответ 26

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

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

Ответ 27

Детали: 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="stackoverflow_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>

Результат

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

Ответ 28

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

tableView.tableFooterView = UIView()

Ответ 29

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

Ответ 30

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

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