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

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

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.


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

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 :)


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.


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

14

Dla Swift:

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

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

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


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

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::).


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;


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


5

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

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

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
}

1
wspaniały! Pracował dla mnie !!
Antony Raphel


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.


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ć.


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.


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ą).


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)


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

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


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

1

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

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

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

0

Spróbuj tego

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

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

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

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)
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.