Wyeliminuj dodatkowe separatory poniżej UITableView

714

Po skonfigurowaniu widoku tabeli z 4 wierszami pod wypełnionymi wierszami nadal znajdują się dodatkowe linie separatora (lub dodatkowe puste komórki).

Jak usunę te komórki?

obraz dodatkowych linii separatora w UITableView

RoundOutTooSoon
źródło

Odpowiedzi:

1505

Konstruktor interfejsów (iOS 9+)

Po prostu przeciągnij UIView do tabeli. W serii ujęć będzie u góry poniżej niestandardowych komórek. Możesz nazwać to „stopką”.

Tutaj jest pokazany na zielono dla jasności, prawdopodobnie chcesz wyraźnego koloru.

Pamiętaj, że dostosowując wysokość, możesz wpływać na sposób obsługi „odbicia od dołu” stołu, jak wolisz. (Wysokość zero jest zwykle w porządku).

wprowadź opis zdjęcia tutaj


Aby to zrobić programowo:

Szybki

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

Cel C

iOS 6.1+

- (void)viewDidLoad 
{
    [super viewDidLoad];

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

lub jeśli wolisz

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

Historycznie w iOS:

Dodaj do kontrolera widoku tabeli ...

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

a jeśli to konieczne ...

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

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}
J. Costa
źródło
Myślę, że twoje opisy i kod są odwrócone. W każdym razie zadziałało to świetnie. Używam tylko „prawdziwych” stopek z pogrupowanymi tabelami, więc dodałem if (tableView.style! = UITableViewStyleGrouped) {} ​​wokół twojego kodu. Teraz wszystkie moje niezgrupowane tabele tracą dodatkowe komórki, a moje zgrupowane tabele pozostają nienaruszone.
arlomedia
Zgodnie z moją notatką powyżej dodam ostrzeżenie, że jeśli wprowadzisz jakieś warunki do metody viewForFooterInSection, upewnij się, że metoda zwraca UIView lub zero. Jeśli przypadkowo zwrócisz nieważność, aplikacja się zawiesi!
arlomedia,
4
@Mathieu Działa to, ponieważ jeśli tabela ma niestandardową stopkę, nie utworzy wierszy „fantom” w celu wypełnienia widoku tabeli. W ten sposób utworzysz pusty widok, który będzie używany jako stopka i ustawisz wysokość na prawie 0 (nie może to być zero lub iOS go nie wyrenderuje). Za pomocą tej prostej sztuczki zmienisz domyślne zachowanie.
J. Costa
2
@ j.Costa: Twoje rozwiązanie będzie działać tylko raz podczas tworzenia uitableview. po kliknięciu ostatniej komórki twoje rozwiązanie nie jest już lepsze. popraw swoją odpowiedź.
3
Użycie tableFooterViewpozostawia separator w ostatniej komórce w wierszu, ponieważ tabela nadal przewiduje zawartość poniżej tej komórki. Użycie historycznego sposobu wyeliminuje ten ostatni separator i ogólnie będzie wyglądało lepiej.
James Kuang,
128

Oto inny sposób na zrobienie tego bez stylu pogrupowanego stołu, którego prawdopodobnie nie zgadniesz. Dodanie nagłówka i stopki do tabeli (być może jeden lub drugi wystarczy, nie zaznaczono) powoduje, że separatory znikają z wypełniacza / pustych wierszy.

Natknąłem się na to, ponieważ chciałem trochę miejsca na górze i na dole stolików, aby zmniejszyć ryzyko uderzenia w guziki zamiast komórki stołu mięsistymi palcami. Oto metoda umieszczenia pustego widoku jako nagłówka i stopki. Użyj dowolnej wysokości, nadal eliminujesz dodatkowe linie separatora.

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

W odpowiedzi na @Casebash wróciłem do kodu w mojej aplikacji (Menedżer list „AcmeLists” w sklepie iTunes ...) i zwróciłem uwagę na metodę addHeaderAndFooter w celu weryfikacji. Bez tego mam dodatkowe separatory wierszy; z kodem mam to, co widzisz w tym oknie: brak obrazu separatorów wierszy tabeli . Nie jestem więc pewien, dlaczego by to nie zadziałało. Co więcej, ma dla mnie sens, że posiadanie dowolnej niestandardowej stopki w widoku tabeli musi koniecznie przestać rysować separatory wierszy dla pustych wierszy poniżej. To byłoby ohydne. Dla porównania, przejrzałem tabele, w których było więcej wierszy niż można było wyświetlić na ekranie, a następnie tabelę z dwoma rzędami. W obu przypadkach brak obcych separatorów.

Być może twoje niestandardowe widoki nie zostały faktycznie dodane. Aby to sprawdzić, ustaw kolor tła na inny niż clearColornp [UIColor redColor]. Jeśli nie widać czerwonych pasków u dołu tabeli, stopka nie została ustawiona.

wkw
źródło
1
Możesz to zrobić również w IB. Po prostu przeciągnij UIView na dole TableView i ustaw wysokość na 1.
Ortwin Gentz
70

Usuwanie dodatkowych linii separatora dla pustych wierszy w UITableView w Swift

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}
dineshthamburu
źródło
34

Chciałbym przedłużyć wkw odpowiedź:

Wystarczy dodać tylko stopkę o wysokości 0. (testowany na SDK 4.2, 4.4.1)

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

    [self.myTableView setTableFooterView:v];
}

lub nawet prościej - tam, gdzie konfigurujesz widok tabeli, dodaj ten wiersz:

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

lub jeszcze prościej - aby po prostu usunąć wszelkie separatory:

[_tableView setTableFooterView:[UIView new]];

Jeszcze raz dziękuję wkw :)

Guntis Treulands
źródło
To jest prawidłowa odpowiedź, ponieważ w innych metodach ostatni wiersz pozostaje bez separatora linii
Ankush
22

Na iOS 7+ za pomocą Storyboardów

Po prostu przeciągnij a UIViewdo UITableViewstopki. Ustaw wysokość widoku stopki na 0.

Kyle Clegg
źródło
18

Spróbuj tego. To działało dla mnie:

- (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
źródło
14

Dla Swift:

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableFooterView = UIView()
    }
Sebastian
źródło
11

Jeśli używasz Swift, dodaj następujący kod do viewDidLoad kontrolera, który zarządza tableview:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView()
}
Babatunde Adeyemi
źródło
8

Możesz po prostu dodać pustą stopkę na końcu, aby ukryć puste komórki, ale będzie też wyglądać dość brzydko:

tableView.tableFooterView = UIView()

wprowadź opis zdjęcia tutaj

Istnieje lepsze podejście: dodaj 1-punktową linię na końcu widoku tabeli jako stopkę, a puste komórki również nie będą już wyświetlane.

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

wprowadź opis zdjęcia tutaj

Darko
źródło
Bardzo ładne wejście, jednak nie trzeba tworzyć ostatniej komórki z grubym kolorem separatora na dole, zamiast tego po prostu ustaw ten sam kolor tła komórki, a także zniknie.
Gustavo Baiocchi Costa
Jakkolwiek wolisz Ale myślę, że taki „nieukończony” separator wygląda dość brzydko.
Darko
7

po prostu dodaj ten kod ( Swift ). .

tableView.tableFooterView = UIView()
Roy
źródło
1
Duplikat wielu odpowiedzi, w tym górnej odpowiedzi wiki i odpowiedzi Sebastiana
Cœur
7

Postęp w rozwiązaniu J. Costa: Możesz wprowadzić globalną zmianę w tabeli, umieszczając następujący wiersz kodu:

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

wewnątrz pierwszej możliwej metody (zwykle w metodzie AppDelegate: w application:didFinishLaunchingWithOptions::).

o.shnn
źródło
2
Ostrożnie z tym, są przypadki, w których zamierzone stopki mogą zostać zastąpione, a spędzisz dzień lub dwa, kwestionując swoje zdrowie psychiczne. Ponadto tableFooterView nie jest oznaczony UI_APPEARANCE_SELECTOR, więc rzeczywiste zachowanie może się zmienić w dowolnym momencie.
mwright
6

Wiem, że na to pytanie została zaakceptowana odpowiedź, ale podaję tutaj różne sposoby na ukrycie dodatkowej linii separatora UITableView.

Możesz ukryć tableViewstandardową linię separatora i dodać własną linię u góry każdej komórki.

Aktualizacja:

Najłatwiejszym sposobem dodania niestandardowego separatora jest dodanie prostej UIViewo wysokości 1px:

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
separatorLineView.backgroundColor = [UIColor grayColor]; /// may be here is clearColor;
[cell.contentView addSubview:separatorLineView];

LUB

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

LUB

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

LUB Najlepszy i prosty sposób, jaki kiedykolwiek lubię

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

Wypróbuj dowolną z nich;

iPatel
źródło
6

Możesz znaleźć wiele odpowiedzi na to pytanie. Większość z nich wokół manipulacji z UITableView„s tableFooterViewatrybut i to jest właściwa droga, aby ukryć puste wiersze. Dla wygody stworzyłem proste rozszerzenie, które pozwala włączać / wyłączać puste wiersze w interfejsie Konstruktora. Możesz to sprawdzić z tego pliku gist . Mam nadzieję, że zaoszczędzi to trochę twojego czasu.

extension UITableView {

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

Stosowanie:

tableView.isEmptyRowsHidden = true

wprowadź opis zdjęcia tutaj

Stanislau Baranouski
źródło
5

uitableview dodatkowa linia separatora ukryj dodatkowe linie separatora ukryj w swift 3.0

 self.tbltableView.tableFooterView = UIView(frame: .zero)
Parth Changela
źródło
5

Jeśli nie chcesz żadnego separatora po ostatniej komórce, potrzebujesz stopki bliskiej zeru, ale niezerowej wysokości.

W twoim UITableViewDelegate:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}
Cœur
źródło
1
wspaniały! Pracował dla mnie !!
Antony Raphel
5

Swift świetnie współpracuje z:

tableView.tableFooterView = UIView()
Marcelo Gracietti
źródło
3

Wystarczy dodać widok z wybranym kolorem separatora jako kolorem tła, 100% szerokości, wysokości 1px w pozycji x0 y-1 do tableViewCell. Upewnij się, że tableViewCell nie przycina widoków podrzędnych, zamiast tego tableView powinien.

Otrzymujesz więc absolutnie prosty i działający separator tylko pomiędzy istniejącymi komórkami, bez żadnego hacka na kod lub IB.

Uwaga: przy pionowym odbiciu u góry pojawia się 1. separator, ale nie powinno to stanowić problemu, ponieważ jest to domyślne zachowanie iOS.

maaalex
źródło
3

Korzystałem z widoku tabeli, aby pokazać stałą liczbę rzędów o stałej wysokości, więc po prostu zmieniłem jej rozmiar i sprawiłem, że nie można go przewijać.

Casebash
źródło
3

Aby programowo wyeliminować dodatkowe linie separatora z dolnej części UItableview, po prostu zapisz następujące dwa wiersze kodu, aby usunąć z niego dodatkowy separator.

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

Ta sztuczka działa na mnie cały czas, spróbuj sam.

Kalpesh Panchasara
źródło
2

Miałem trochę szczęścia, wdrażając jedną z zaakceptowanych odpowiedzi (iOS 9+, Swift 2.2). Próbowałem wdrożyć:

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

Jednak nie miało to na mnie wpływu tableView- uważam, że może mieć to coś wspólnego z faktem, że używałem UITableViewController.

Zamiast tego musiałem tylko przesłonić viewForFooterInSectionmetodę (nie ustawiłem tableFooterViewgdzie indziej):

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

Działa to dobrze w tableViewprzypadku pojedynczej sekcji (jeśli masz wiele sekcji, musisz określić ostatnią).

BAP
źródło
2

Jeśli masz tylko jedną sekcję, najszybszym i najprostszym sposobem jest ustawienie stylu widoku tabeli z „Zwykły” na „Zgrupowany”. (patrz zdjęcie)

Tabela zgrupowane

Jeśli masz więcej sekcji, może być konieczne ustawienie wysokości nagłówka na zero (w zależności od upodobań twojego / twojego klienta / kierownika projektu)

Jeśli masz więcej sekcji i nie chcesz zadzierać z nagłówkami (nawet jeśli w najprostszym przypadku jest to tylko jedna linia), musisz ustawić UIView jako stopkę, jak wyjaśniono w poprzednich odpowiedziach)

Ryba Gefilte
źródło
2

Rozszerzenie Swift 4.0

Tylko małe rozszerzenie do scenorysu:

wprowadź opis zdjęcia tutaj

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}
Nik Kov
źródło
2

Szybki i łatwy Swift 4 way.

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

Jeśli masz komórki statyczne. Możesz także wyłączyć separator w oknie Inspektora. (nie będzie to pożądane, jeśli potrzebujesz separatora. W takim przypadku użyj metody pokazanej powyżej) okno inspektora

Alix
źródło
Ustawienie nowego UIView dla tableFooterView zostało już udzielone 10 razy, z lepszym wyjaśnieniem dlaczego, lepszy kod (brakuje super.viewDidLoad()) i znajduje się w odpowiedzi wiki na górze. Jeśli chodzi o usunięcie wszystkich separatorów, to nie o to chodzi w tym pytaniu, więc lepiej cofnij swoją ostatnią edycję i / lub całkowicie usuń swoją odpowiedź.
Cœur
1

Jeśli chcesz usunąć niechciane miejsce w UITableview, możesz użyć poniższych dwóch metod

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}
Hari c
źródło
1

Dodałem to małe rozszerzenie widoku tabeli, które pomaga przez cały czas

extension UITableView {
     func removeExtraCells() {
         tableFooterView = UIView(frame: .zero)
     }
}
Suresh Varma
źródło
1

Spróbuj tego

dla celu C

- (void)viewDidLoad 
 {
  [super viewDidLoad];
  // This will remove extra separators from tableview
  self.yourTableView.tableFooterView = [UIView new];
}

dla Swift

override func viewDidLoad() {
 super.viewDidLoad()
 self.yourTableView.tableFooterView = UIView()
}
Atanu Mondal
źródło
0

Spróbuj tego

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
Visnu
źródło
0

UIKitnie tworzy pustej komórki, gdy tableViewma tableFooterView. Możemy więc zrobić lewę i przypisać obiekt o zerowej wysokości UIViewjako stopkę tableView.

tableView.tableFooterView = UIView()
iMuzahid
źródło
0

Jeśli masz searchbarw swoim view(na przykład, aby ograniczyć liczbę wyników), musisz również dodać następujące w shouldReloadTableForSearchStringishouldReloadTableForSearchScope:

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];
użytkownik3900346
źródło
0

W Swift (używam 4,0), można to osiągnąć poprzez tworzenie niestandardowej UITableViewCellklasy, a overridingten setSelectedsposób. Następnie separator insetswszystko do 0 . (moja główna klasa z widokiem tabeli ma wyraźne tło) kolor.

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)
}
Hoptown
źródło