ios - site - xcode beta 9




Éliminer les séparateurs supplémentaires sous UITableView (20)

Lorsque je configure une vue de table avec 4 lignes, il existe toujours des lignes de séparateurs supplémentaires (ou des cellules vides supplémentaires) sous les lignes remplies.

Comment pourrais-je enlever ces cellules?


Générateur d'interface (iOS 9+)

Faites simplement glisser un UIView sur la table. Dans le storyboard, il sera placé en haut de vos cellules personnalisées. Vous préférerez peut-être le nommer "footer".

Ici, il est montré en vert pour plus de clarté, vous voudrez probablement une couleur claire.

Notez qu'en ajustant la hauteur, vous pouvez affecter la façon dont le "rebond inférieur" de la table est géré, comme vous préférez. (La hauteur zéro est généralement bien).

Pour le faire par programme:

Rapide

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

Objectif c

iOS 6.1+

- (void)viewDidLoad 
{
    [super viewDidLoad];

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

ou si vous préférez,

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

Historiquement dans iOS:

Ajouter au contrôleur de vue de table ...

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

et si nécessaire ...

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

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

Pour Swift:

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

Swift 4.0 Extension

Juste une petite extension pour le storyboard:

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

Dans le cas où vous avez une barre de recherche dans votre vue (pour limiter le nombre de résultats par exemple), vous devez également ajouter ce qui suit dans shouldReloadTableForSearchString et shouldReloadTableForSearchScope:

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

Essaye ça. Cela a fonctionné pour moi:

- (void) viewDidLoad
{
  [super viewDidLoad];

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

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

Faire progresser la solution de J. Costa: Vous pouvez apporter un changement global à la table en mettant cette ligne de code:

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

à l'intérieur de la première méthode poosible (généralement dans AppDelegate, dans: application: didFinishLaunchingWithOptions: méthode).


J'ai eu de la chance en implémentant une seule partie de la réponse acceptée (iOS 9+, Swift 2.2). J'avais essayé d'implémenter:

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

Cependant, il n'y avait aucun effet sur mon tableView - je crois que cela peut avoir quelque chose à voir avec le fait que j'utilisais UITableViewController .

Au lieu de cela, j'ai seulement dû remplacer la méthode viewForFooterInSection (je n'ai pas défini la tableFooterView ailleurs):

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

Cela a bien fonctionné pour une tableView avec une seule section (si vous avez plusieurs sections, vous devez spécifier le dernier).


J'utilisais une vue de table pour montrer un nombre fixe de colonnes, donc je l'ai simplement redimensionné et rendu non-scrollable.


Je viens d'ajouter cette ligne à la fonction ViewDidLoad et le problème résolu.

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

Je voudrais prolonger la réponse de wkw :

Ajouter simplement un pied de page avec la hauteur 0 fera l'affaire. (testé sur sdk 4.2, 4.4.1)

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

    [self.myTableView setTableFooterView:v];
}

ou encore plus simple - où vous configurez votre tableview, ajoutez cette ligne:

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

ou encore plus simple - pour supprimer simplement les séparateurs:

[_tableView setTableFooterView:[UIView new]];

Merci encore à wkw :)


Pour éliminer les lignes de séparation supplémentaires du bas de UItableview par programmation, il suffit d'écrire après deux lignes de code et cela supprimera le séparateur supplémentaire.

tableView.sectionFooterHeight = 0.f;

tableView.sectionHeaderHeight = 0.f;

Cette astuce travaille pour moi tout le temps, essaie toi-même. @KPCoding ...


Rapide et facile Swift 4 voies.

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

Si vous avez des cellules statiques. Vous pouvez également désactiver le séparateur dans la fenêtre Inspecteur. (ce ne sera pas souhaitable si vous avez besoin du séparateur, dans ce cas utilisez la méthode montrée ci-dessus)


Si vous ne voulez pas de séparateur après la dernière cellule, vous avez besoin d'une hauteur proche de zéro mais non nulle pour votre pied de page.

Dans votre UITableViewDelegate :

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

Si vous souhaitez supprimer l'espace indésirable dans UITableview, vous pouvez utiliser deux méthodes ci-dessous

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

Si vous utilisez Swift, ajoutez le code suivant à viewDidLoad du contrôleur qui gère la tableview:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

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

Suppression de lignes de séparation supplémentaires pour les lignes vides dans UITableView dans Swift

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

Voici une autre façon de le faire sans le style de tableau groupé, et un que vous ne devineriez probablement pas. Ajouter un en-tête et un pied de page à la table (peut-être que l'un ou l'autre ne suffit pas, n'ont pas été cochés) fait disparaître les séparateurs des rangées de remplissage / vides.

Je suis tombé dessus parce que je voulais un peu d'espace en haut et en bas des tables pour diminuer le risque de frapper des boutons au lieu d'une cellule de table avec des doigts charnus. Voici une méthode pour coller une vue vide en tant qu'en-tête et pied de page. Utilisez n'importe quelle hauteur que vous aimez, vous éliminez toujours les lignes de séparation supplémentaires.

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

En réponse à @Casebash, je suis retourné au code dans mon application (gestionnaire de listes "AcmeLists" dans le magasin iTunes ...) et court-circuite la méthode addHeaderAndFooter pour vérifier. Sans cela , j'ai les séparateurs de rangée supplémentaires; avec le code, j'ai ce que vous voyez dans cette fenêtre snap: pas de séparateur de ligne de tableau image . Donc je ne sais pas pourquoi ça n'aurait pas marché pour vous. De plus, il est logique pour moi d'avoir un pied de page personnalisé sur une vue de table qui devrait nécessairement arrêter de dessiner des séparateurs de ligne pour les lignes vides en dessous. Ce serait hideux. Pour référence, j'ai regardé des tableaux où il y avait plus de lignes que ce qui pouvait être vu à l'écran, et ensuite pour une table avec deux rangées. Dans les deux cas, pas de séparateurs étrangers.

Peut-être que vos vues personnalisées n'ont pas été réellement ajoutées. Pour vérifier cela, définissez la couleur d'arrière-plan sur autre chose que clearColor , par exemple, [UIColor redColor] . Si vous ne voyez pas de barres rouges au bas de la table, votre pied de page n'a pas été défini.


Vous pouvez simplement ajouter un pied de page vide à la fin puis il va cacher les cellules vides mais il aura aussi l'air assez moche:

tableView.tableFooterView = UIView()

Il y a une meilleure approche: ajouter une ligne de 1 point à la fin de la vue de la table en tant que pied de page et les cellules vides ne seront plus affichées.

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 ne crée pas de cellule vide lorsque tableView a une tableFooterView . Nous pouvons donc faire une astuce et assigner un objet UIView hauteur UIView comme pied de page de la tableView .

tableView.tableFooterView = UIView()

Détails: Swift 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
        }
    }
}

Usage

// hide empty cells
tableView.emptyCellsEnabled = false

// show empty cells
tableView.emptyCellsEnabled = true

Exemple complet

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

Résultat





cocoa-touch