ios swift - Entfernen Sie zusätzliche Trennzeichen unterhalb von UITableView




programmatically delegate (25)

Swift 4.0 Erweiterung

Nur eine kleine Erweiterung für das Storyboard:

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

Wenn ich eine Tabellenansicht mit 4 Zeilen einrichte, gibt es immer noch zusätzliche Trennlinien (oder zusätzliche leere Zellen) unterhalb der gefüllten Reihen.

Wie würde ich diese Zellen entfernen?


Details: Schnelle 3, Xcode: 8.1

Code

extension UITableView {

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

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

Verwendung

// hide empty cells
tableView.emptyCellsEnabled = false

// show empty cells
tableView.emptyCellsEnabled = true

Vollständiges Beispiel

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

Hauptspeicher

<?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="_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>

Ergebnis


Advancing J. Costa Lösung: Sie können eine globale Änderung der Tabelle vornehmen, indem Sie diese Codezeile einfügen:

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

innerhalb der ersten poosible-Methode (normalerweise in AppDelegate, in: application: didFinishLaunchingWithOptions: method).


Für iOS 7+ mit Storyboards

Ziehen UIView einfach eine UIView in Ihre UITableView als Fußzeile. Stellen Sie die Höhe der Fußzeilenansicht auf 0 ein.


Versuche dies. Es hat für mich funktioniert:

- (void) viewDidLoad
{
  [super viewDidLoad];

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

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

Sie können einfach eine leere Fußzeile am Ende hinzufügen, dann werden die leeren Zellen ausgeblendet, aber es sieht auch ziemlich hässlich aus:

tableView.tableFooterView = UIView()

Es gibt einen besseren Ansatz: Fügen Sie am Ende der Tabellenansicht eine 1-Punkt-Linie als Fußzeile hinzu, und die leeren Zellen werden ebenfalls nicht mehr angezeigt.

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


UIKit keine leere Zelle, wenn die tableView eine tableFooterView . So können wir einen Trick machen und ein UIView Objekt mit der Höhe UIView als Fußzeile der tableView .

tableView.tableFooterView = UIView()

Schnell und einfach Swift 4-Wege.

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

Wenn Sie statische Zellen haben. Sie können das Trennzeichen auch im Inspektorfenster deaktivieren. (Dies ist nicht wünschenswert, wenn Sie das Trennzeichen benötigen. In diesem Fall verwenden Sie die oben gezeigte Methode)


Wenn Sie Swift verwenden, fügen Sie den folgenden Code zu viewDidLoad des Controllers hinzu, der die Tabellenansicht verwaltet:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

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

Um zusätzliche Trennlinien vom unteren Rand der UItable-Ansicht programmgesteuert zu entfernen, notieren Sie sich die folgenden zwei Codezeilen und entfernen Sie ein zusätzliches Trennzeichen.

tableView.sectionFooterHeight = 0.f;

tableView.sectionHeaderHeight = 0.f;

Dieser Trick funktioniert für mich die ganze Zeit, probier es selbst aus. @KPCodierung ...


Swift 3 / Swift 4, sehr einfach und einfach

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

ODER

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

Hier ist eine andere Möglichkeit, dies ohne den gruppierten Tabellenstil zu tun, und einen, den Sie wahrscheinlich nicht erraten würden. Wenn Sie der Tabelle eine Kopf- und Fußzeile hinzufügen (möglicherweise reicht das eine oder das andere nicht aus), werden die Trennzeichen aus den Füll- / Leerzeilen entfernt.

Ich bin darüber gestolpert, weil ich ein wenig Platz oben und unten auf den Tischen haben wollte, um das Risiko zu verringern, Knöpfe zu treffen statt einer Tischzelle mit fleischigen Fingern. Hier ist eine Methode, um eine leere Ansicht als Kopf- und Fußzeile zu speichern. Verwenden Sie die gewünschte Höhe, und eliminieren Sie die zusätzlichen Trennlinien.

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

Als Antwort auf @Casebash ging ich zurück zu dem Code in meiner App ("AcmeLists" List Manager im iTunes Store ...) und schloss die addHeaderAndFooter-Methode zur Verifizierung kurz. Ohne es habe ich die zusätzlichen Reihenseparatoren; mit dem code habe ich was du in diesem fenster siehst snap: kein tabellenzeilen separator bild . Ich bin mir also nicht sicher, warum es für dich nicht funktioniert hätte. Darüber hinaus macht es für mich Sinn, dass eine benutzerdefinierte Fußzeile in einer Tabellenansicht nicht mehr mit Zeilentrennzeichen für leere Zeilen darunter gezeichnet werden muss. Das wäre scheußlich. Als Referenz betrachtete ich Tabellen, in denen es mehr Zeilen gab, als auf dem Bildschirm angezeigt werden konnten, und dann für eine Tabelle mit zwei Zeilen. In beiden Fällen keine Fremdseparatoren.

Möglicherweise wurden Ihre benutzerdefinierten Ansichten nicht hinzugefügt. Um das zu überprüfen, setzen Sie die Hintergrundfarbe auf etwas anderes als clearColor , zB [UIColor redColor] . Wenn Sie am unteren Ende der Tabelle keine roten Balken sehen, wurde Ihre Fußzeile nicht festgelegt.


Zusätzliche Trennlinien verstecken extra Trennlinien ausblenden in swift 3.0

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

Ich füge einfach diese Zeile bei der ViewDidLoad-Funktion und Problem behoben.

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

Schnittstellenerstellung (iOS 9+)

Ziehen Sie einfach eine UIView auf die Tabelle. Im Storyboard befindet es sich oben unter den benutzerdefinierten Zellen. Sie können es bevorzugen, es "Fußzeile" zu nennen.

Hier ist es grün dargestellt, um Klarheit zu schaffen. Wahrscheinlich möchten Sie eine klare Farbe.

Beachten Sie, dass Sie durch Anpassen der Höhe beeinflussen können, wie die "Bodenprellung" der Tabelle gehandhabt wird, wie Sie es bevorzugen. (Höhe Null ist normalerweise gut).

Um es programmgesteuert zu tun:

Schnell

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

Ziel c

iOS 6.1+

- (void)viewDidLoad 
{
    [super viewDidLoad];

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

oder wenn Sie bevorzugen,

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

Historisch in iOS:

Zum Tabellenansicht-Controller hinzufügen ...

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

und wenn nötig ...

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

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}

Für Swift:

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

Wenn Sie nur einen Abschnitt haben, ist der schnellste und einfachste Weg, den Tabellenansichtsstil von "Einfach" auf "Gruppiert" zu setzen. (siehe Bild)

Wenn Sie mehr Abschnitte haben, müssen Sie die Kopfhöhe möglicherweise auf Null setzen (abhängig vom Geschmack Ihres / Ihres Kunden / Ihres Projektmanagers)

Wenn Sie mehr Abschnitte haben und nicht mit den Headern herumhantieren wollen (auch wenn es im einfachsten Fall nur eine Zeile ist), dann müssen Sie eine UIView als Fußzeile einstellen, wie es in den vorherigen Antworten erklärt wurde)


Wenn Sie nach der letzten Zelle kein Trennzeichen mehr benötigen, benötigen Sie für Ihre Fußzeile eine nahe Null, aber nicht Null.

In Ihrem UITableViewDelegate :

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

Fügen Sie einfach eine Ansicht mit der gewünschten Trennfarbe als Hintergrundfarbe, 100% Breite, 1px Höhe an der Position x0 y-1 zu Ihrer tableViewCell hinzu. Stellen Sie sicher, dass die TableViewCell keine Subviews schneidet, sondern TableView.

So erhalten Sie ein absolut einfaches und funktionierendes Trennzeichen nur zwischen bestehenden Zellen ohne jeden Hack per Code oder IB.

Hinweis: Bei einem vertikalen Top-Bounce wird das erste Trennzeichen angezeigt. Dies sollte jedoch kein Problem sein, da es sich um das Standard-iOS-Verhalten handelt.


Ich hatte etwas Glück, als ich ein einzelnes Stück der angenommenen Antwort implementierte (iOS 9+, Swift 2.2). Ich hatte versucht zu implementieren:

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

Es gab jedoch keine Auswirkungen auf meine tableView - ich glaube, dass es etwas mit der Tatsache zu tun hat, dass ich UITableViewController .

Stattdessen musste ich nur die viewForFooterInSection Methode überschreiben (ich habe die tableFooterView anderswo festgelegt):

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

Dies funktionierte für ein tableView mit einem einzelnen Abschnitt (wenn Sie mehrere Abschnitte haben, müssen Sie den letzten Abschnitt angeben).


Füge einfach diesen Code hinzu ( Swift ). .

tableView.tableFooterView = UIView()

Entfernen von zusätzlichen Trennlinien für leere Zeilen in UITableView in Swift

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

SWIFT 3.0 funktioniert gut mit tableView.tableFooterView = UIView()


Wenn Sie unerwünschten Speicherplatz in UITableview entfernen möchten, können Sie zwei Methoden verwenden

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

UITableView im Storyboard die UITableView und ändern Sie die Eigenschaft Style von Plain to Grouped .





ios uitableview cocoa-touch