UITableView altındaki ekstra ayırıcıları ortadan kaldırın


716

4 satırlı bir tablo görünümü ayarladığımda, doldurulmuş satırların altında hala fazladan ayırıcı çizgiler (veya fazladan boş hücreler) var.

Bu hücreleri nasıl çıkarabilirim?

UITableView'da fazladan ayırıcı çizgiler için görüntü

Yanıtlar:


1506

Arayüz oluşturucu (iOS 9+)

Bir UIView'i tabloya sürüklemeniz yeterlidir. Film şeridinde, özel hücrelerinizin altında en üstte bulunur. "Altbilgi" olarak adlandırmayı tercih edebilirsiniz.

Burada netlik için yeşil renkte gösterilir, muhtemelen net renk istersiniz.

Yüksekliği ayarlayarak tablonun "alt sıçramasının" nasıl tercih edileceğini etkileyebileceğinizi unutmayın. (Sıfır yüksekliği genellikle iyidir).

resim açıklamasını buraya girin


Programlı olarak yapmak için:

hızlı

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

Objective-C

iOS 6.1 ve sonraki sürümleri

- (void)viewDidLoad 
{
    [super viewDidLoad];

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

ya da isterseniz,

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

Geçmişte iOS'ta:

Tablo görünümü denetleyicisine ekle ...

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

ve gerekirse ...

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

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

Bence açıklamalarınız ve kodunuz tersine döndü. Her neyse, bu benim için harika çalıştı. Ben sadece gruplandırılmış tablolarla "gerçek" altbilgi kullanın, bu yüzden kodunuzun etrafında (tableView.style! = UITableViewStyleGrouped) {} ​​ekledim. Artık gruplandırılmamış tablolarım ekstra hücrelerini kaybederken, gruplandırılmış tablolarım etkilenmez.
arlomedia

Yukarıdaki notumun ardından, viewForFooterInSection yöntemine herhangi bir koşul koyarsanız, yöntemin bir UIView veya nil döndürdüğünden emin olun. Yanlışlıkla geçersiz dönüş yaparsanız uygulamanız kilitlenir!
arlomedia

4
@Mathieu Tablonun özel bir altbilgisi varsa, tablo görünümünü doldurmak için "fantom" satırları oluşturmayacağı için bu çalışır. Böylece, altbilgi olarak kullanılacak boş bir görünüm oluşturacak ve yüksekliği 0'a ayarlayacaksınız (sıfır olamaz veya iOS bunu oluşturmaz). Bu basit hile ile varsayılan davranışı değiştireceksiniz.
J. Costa

2
@ j.Costa: Çözümünüz uitableview oluşturulurken yalnızca bir kez çalışır. Son hücreye tıkladıktan sonra çözümünüz daha iyi değil. lütfen cevabınızı geliştirin.

3
Kullanılması tableFooterViewtablo hala o hücrenin altında içerik beklediğini olarak, yaprakları sıradaki son hücreye bir ayırıcı. Tarihsel yolu kullanmak, son ayırıcıyı ortadan kaldıracak ve genel olarak daha iyi görünecektir.
James Kuang

128

İşte bunu gruplandırılmış tablo stilini kullanarak yapmanın başka bir yolu ve muhtemelen tahmin edemeyeceğiniz bir yöntem. Tabloya bir üstbilgi ve altbilgi eklemek (belki bir veya diğeri yeterli, kontrol edilmemiş) ayırıcıların dolgu / boş satırlardan kaybolmasına neden olur.

Bunun üzerine tökezledim, çünkü etli parmaklı bir tablo hücresi yerine düğmelere basma riskini azaltmak için masaların üstünde ve altında biraz boşluk istedim. Üstbilgi ve altbilgi olarak boş bir görünüm yapıştırmak için bir yöntem. İstediğiniz yüksekliği kullanın, yine de ekstra ayırıcı çizgileri ortadan kaldırırsınız.

- (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'a yanıt olarak, uygulamamdaki koda geri döndüm (iTunes mağazasında "AcmeLists" Liste Yöneticisi ...) ve doğrulamak için addHeaderAndFooter yöntemini kısa devre yaptım. Onsuz , ekstra satır ayırıcıları var; kod ile, ben bu pencere ek gördüğünüz var: hiçbir tablo satır ayırıcılar resim . Bu yüzden neden senin için işe yaramayacağından emin değilim. Dahası, bir tablo görünümünde herhangi bir özel altbilgiye sahip olmanın, altındaki boş satırlar için satır ayırıcıları çizmeyi durdurması gerektiği anlamına gelir. Bu iğrenç olurdu. Referans olarak, ekranda görüntülenenden daha fazla satırın bulunduğu tablolara ve sonra iki sıralı bir tabloya baktım. Her iki durumda da, yabancı ayırıcılar yoktur.

Özel görünümleriniz aslında eklenmemiş olabilir. Bunu kontrol etmek için, arka plan rengini clearColorör [UIColor redColor]. Tablonun altında kırmızı çubuklar görmüyorsanız, altbilginiz ayarlanmamıştır.


1
Bunu IB'de de yapabilirsiniz. Sadece bir UIView'i TableView'in altına sürükleyin ve yüksekliği 1 olarak ayarlayın.
Ortwin Gentz

70

Swift'teki UITableView'da boş satırlar için ek ayırıcı satırları kaldırma

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

34

Wkw cevabını uzatmak istiyorum :

Sadece yüksekliği 0 olan altbilgi eklemek hile yapar. (sdk 4.2, 4.4.1'de test edilmiştir)

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

    [self.myTableView setTableFooterView:v];
}

veya daha da basit - tablo görünümünüzü ayarladığınız yere şu satırı ekleyin:

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

veya daha da basit - ayırıcıları kaldırmak için:

[_tableView setTableFooterView:[UIView new]];

Wkw tekrar teşekkürler :)


Bu doğru cevap, diğer yöntemlerde coz son sıra hiçbir satır ayırıcı ile kalır
Ankush

22

Storyboard'ları kullanan iOS 7+ için

Basitçe bir sürükle UIViewSİZİN içine UITableViewaltbilgi. Altbilgi görünümünün yüksekliğini 0 olarak ayarlayın.


18

Bunu dene. Benim için çalıştı:

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

Swift için:

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

11

Swift kullanıyorsanız, tablo görünümünü yöneten denetleyicinin viewDidLoad öğesine aşağıdaki kodu ekleyin :

override func viewDidLoad() {
    super.viewDidLoad()

    //...

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

8

Sonunda boş bir altbilgi ekleyebilirsiniz, ardından boş hücreleri gizler, ancak aynı zamanda oldukça çirkin görünür:

tableView.tableFooterView = UIView()

resim açıklamasını buraya girin

Daha iyi bir yaklaşım vardır: altbilgi ve boş hücreler artık gösterilmeyeceğinden tablo görünümünün sonuna 1 puntoluk bir satır ekleyin.

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

resim açıklamasını buraya girin


Çok güzel bir girdi, ancak son hücrenizi altta kalın bir ayırıcı renkle yapmaya gerek yok, bunun yerine hücrenin aynı arka plan rengini yapın ve aynı zamanda yok olur.
Gustavo Baiocchi Costa

Ancak tercih edersiniz. Ama sanırım "tamamlanmamış" ayırıcı oldukça çirkin gözüküyor.
Darko


7

J. Costa'nın çözümünü ilerletmek: Bu kod satırını koyarak tabloya genel bir değişiklik yapabilirsiniz:

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

mümkün olan ilk yöntemin içinde (genellikle AppDelegate, içinde: application:didFinishLaunchingWithOptions:yöntemi).


2
Bu konuda dikkatli olun, amaçladığınız altbilginin geçersiz kılınabileceği durumlar vardır ve akıl sağlığınızı sorgulamak için bir iki gün geçireceksiniz. Ayrıca, tableFooterView, UI_APPEARANCE_SELECTOR ile işaretlenmediğinden, gerçek davranış her an değişebilir.
mwright

6

Bu sorunun cevap kabul edildiğini biliyorum, ancak buraya Ekstra ayırıcı çizgisini gizlemek için farklı yollar koydum UITableView .

tableViewStandart ayırıcı satırını gizleyebilir ve özel satırınızı her hücrenin üstüne ekleyebilirsiniz.

Güncelleme:

Özel ayırıcı eklemenin en kolay yolu 1 UIViewpiksel yüksekliğe basit eklemektir :

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

VEYA

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

VEYA

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

VEYA Şimdiye kadar sevdiğim en iyi ve basit yol

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

Birini deneyin;


6

Bu soruya birçok cevap bulabilirsiniz. Birçoğu UITableView' tableFooterViewözniteliği ile manipülasyon etrafında ve bu boş satırları gizlemek için uygun bir yoldur. Kolaylık sağlamak için, Interface Builder'dan boş satırları açıp kapamanıza izin veren basit bir uzantı oluşturdum. Bu gist dosyasından kontrol edebilirsiniz . Umarım biraz zaman kazanabilir.

extension UITableView {

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

Kullanımı:

tableView.isEmptyRowsHidden = true

resim açıklamasını buraya girin


5

uitableview ekstra ayırıcı çizgi hızlı 3.0 gizlemek ekstra ayırıcı hatları gizlemek

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

5

Son hücreden sonra herhangi bir ayırıcı istemiyorsanız, altbilginiz için sıfıra yakın ancak sıfır olmayan bir yüksekliğe ihtiyacınız vardır.

Sizin UITableViewDelegate:

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

1
süper! Benim için çalıştı !!
Antony Raphel


3

İstediğiniz ayırıcı rengini arka plan rengi,% 100 genişlik, x0 y-1 konumunda 1 piksel yüksekliğe sahip bir görünümü tableViewCell'e eklemeniz yeterlidir. TableViewCell'in alt görünümleri kırpmadığından emin olun; bunun yerine tableView gerekir.

Böylece, kod veya IB başına herhangi bir saldırı olmadan sadece mevcut hücreler arasında mutlak basit ve çalışan bir ayırıcı elde edersiniz.

Not: Dikey bir üst sıçramada 1. ayırıcı görünür, ancak bu sorun olmamalı, çünkü bu varsayılan iOS davranışıdır.


3

Sabit yükseklikteki satır sayısını göstermek için bir tablo görünümü kullanıyordum, bu yüzden basitçe yeniden boyutlandırdım ve kaydırılamaz hale getirdim.


3

Programlı olarak UItableview altından ekstra ayırıcı satırları ortadan kaldırmak için, sadece iki satır kod yazmanız yeterlidir ve bu satırdan fazladan ayırıcı kaldırılır.

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

Bu numara hep benim için çalışıyor, kendini dene.


2

Kabul edilen cevabın tek bir parçasını uygulamada şansım vardı (iOS 9+, Swift 2.2). Uygulamayı denemiştim:

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

Ancak, benim üzerimde bir etkisi olmadı tableView- kullandığım gerçeği ile ilgisi olabileceğine inanıyorumUITableViewController .

Bunun yerine, sadece viewForFooterInSectionyöntemi geçersiz kılmak zorunda kaldı (ben tableFooterViewbaşka bir yerde ayarlanmadı ):

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

Bu tableView, tek bir bölüm içeren bir için iyi çalıştı (birden fazla bölümünüz varsa, son bölümü belirtmeniz gerekir).


2

Yalnızca bir bölümünüz varsa, o zaman en hızlı ve en kolay yol Tablo Görünümü Stilini "Düz" den "Gruplanmış" olarak ayarlamaktır. (resme bakın)

TableView Gruplandırılmış

Daha fazla bölümünüz varsa, başlık yüksekliğini sıfıra ayarlamanız gerekebilir (müşterinizin / proje yöneticinizin zevkine bağlı olarak)

Daha fazla bölümünüz varsa ve başlıklarla uğraşmak istemiyorsanız (en basit durumda sadece bir satır olsa bile), önceki yanıtlarda açıklandığı gibi bir UIView'yi altbilgi olarak ayarlamanız gerekir)


2

Swift 4.0 Uzantısı

Film şeridi için küçük bir uzantı:

resim açıklamasını buraya girin

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

2

Hızlı ve kolay Swift 4 yolu.

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

Statik hücreleriniz varsa. Ayırıcıyı Inspector penceresinden de kapatabilirsiniz. (ayırıcıya ihtiyacınız varsa bu istenmeyecektir. Bu durumda yukarıda gösterilen yöntemi kullanın) denetçi penceresi


TableFooterView'a yeni bir UIView ayarlamak, 10 kez yanıtlandı, neden daha iyi kodla (eksik super.viewDidLoad()) ve daha iyi wiki cevabına dahil edildi. Tüm ayırıcıları kaldırmaya gelince, bu sorunun konusu bu değildir, bu nedenle son düzenlemenizi daha iyi geri alın ve / veya yanıtınızı tamamen silin.
Cur

1

UITableview uygulamasında istenmeyen alanı kaldırmak istiyorsanız aşağıdaki iki yöntemi kullanabilirsiniz

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

1

Boyunca yardımcı olan bu küçük tableview uzantısını ekledim

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

1

Bununla dene

için Objective C

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

için Swift

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

0

Bunu dene

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

0

UIKitne zaman boş hücre yaratmaz tableViewbir sahiptir tableFooterView. Böylece bir hile yapabilir ve UIViewaltbilgi olarak sıfır yükseklikte bir nesne atayabiliriz tableView.

tableView.tableFooterView = UIView()

0

Eğer bir var searchbariçinde senin view(örneğin sonuç sayısını sınırlamak için), ayrıca içinde aşağıdaki eklemek zorunda shouldReloadTableForSearchStringveshouldReloadTableForSearchScope:

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

0

Swift (I 4.0 kullanıyorum), özel oluşturarak gerçekleştirebilirsiniz UITableViewCellsınıf ve yöntemi. Sonra hepsi 0 . (tablo görünümündeki ana sınıfımın net bir arka planı var) renk.overridingsetSelectedseparator insets

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)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.