UITableView'da hücrelerden önce boş alanı kaldırın


172

Şu anda UITableViewgörünüm denetleyicimin üstünde değil, farklı bir konuma koymaya çalışıyorum . Bununla birlikte, gezinme çubuğunu hesaba katmak için üstteki başlığı eklemeye çalışıyor, ancak denetleyicimin üst kısmında olmadığım için buna gerek yok.

UITableViewHücrelerin olmasını istediğim yerin sol üst köşesini koyarsam, hücreleri oraya koymaz:

Şimdi, tablo görünümünü yukarı doğru hareket ettiririm, böylece hücreler doğru yerde olur, farklı bir sorunla karşılaşırım - hücreler kaydırma sırasında oraya kadar hareket ettirilebilir (bu, parmağım gezinme denetleyicisinin üzerindedir):

Bıraktığımda, evet - hücreler arama çubuğunun hemen altına gidecek, ancak bu açıkça onları üstüne getirebileceğiniz bir sorundur.

Bunu nasıl yapabilirim? Daha kolay bir yolu var mı?

Yanıtlar:


378

UITableViewAşağı kaydırdığınızda gösterinin hücreleri boş alan üzerinde mi?

Öyleyse, sorun UITableView, görünümünüzdeki Gezinti denetleyicisinden dolayı eklenen iç metin olabilir . İçeriğin, kaydırma yapılmadığında gezinme çubuğunun altına yerleştirilmesi için tablo görünümüne eklenir. Tablo kaydırıldığında, içerik kayar ve şeffaf bir gezinme çubuğunun altında gösterilir. Bu davranış, elbette, yalnızca tablo görünümü doğrudan gezinme çubuğunun altında başlıyorsa istenir, burada durum böyle değildir.

Dikkat edilmesi gereken başka bir şey, iOS'un içerik ekini yalnızca görünüm hiyerarşisindeki ilk görünüm için ayarlıysa UIScrollViewveya alt öğesi (ör. UITableViewVe UICollectionView) ise ayarlamasıdır. Görünüm hiyerarşiniz birden fazla kaydırma görünümü içeriyorsa, automaticallyAdjustsScrollViewInsetsyalnızca ilk görünümde ayarlamalar yapar.

Bu davranışı nasıl değiştireceğiniz aşağıda açıklanmıştır:

a) Arayüz Oluşturucu

  • Görünüm denetleyicisini seçin
  • Açık Özellikler denetçisi
  • IB'nin öznitelik denetçisinde (bir görünüm denetleyicisi seçildiğinde) varsayılan olarak açık olan "Kaydırma görünümü eklerini ayarla" adlı bir özellik vardır. Bu seçeneğin işaretini kaldırın:


    ( Dheeraj D'nin izniyle )

Hangi Xcode sürümünün bu seçeneği sunduğundan emin değilim (sürüm notlarında bulamadım), ancak en azından 5.1.1 sürümünde kullanılabilir.

Düzenleme: Karışıklığı önlemek için, bu yorumlarda bahsedilen üçüncü seçenekti

b) Programlı olarak

Bunu ie ekleyin viewDidLoad( Slavco Petkovski'nin cevabına ve Cris R'nin yorumuna kredi )

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) Bu eski okul öğrencileri için geçerli olabilir

Ekleyerek bunu düzeltebilirsiniz

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

Veya IB kullanıyorsanız ve gezinme çubuğu şeffaf değilse (ekran görüntüsünden anlatamazsınız)

  • Görünüm denetleyicisini seçin
  • Açık Özellikler denetçisi
  • Görünüm Denetleyicisi seçeneklerinde Kenarları Uzat bölümünde "Üst Çubukların Altında" seçimini kaldırın

2
UIView üzerindeki "Üst Barların Altında" seçimini kaldırmak benim için gayet iyi çalıştı. Teşekkürler.
Andreas Øverland

"Paging Enabled" ı kullanarak çılgına dönüyordum ve kaydırma tüm hücrenin yerine gezinme çubuğu yüksekliğine göre değişiyordu. Teşekkürler.
LordParsley

8
Üçüncü seçenek: "Kaydırma görünümü iç metinlerini ayarla" seçimini kaldırın - bir cazibe gibi çalıştı. teşekkürler lekksi!
Stas Zhukovskiy

2
self.automaticallyAdjustsScrollViewInsets = Swift çalışan "de pelos" da yanlış!
Cris R

1
UIEdgeInsetsZero ayarı sayesinde, her seferinde yeni bir tablo denetleyicisinde bir tablo yeniden kullanılırsa, aksi takdirde aynı beyaz boşluk göründüğünde ve büyüdükçe gereklidir.
malhal

71

Aynı sorunu yaşadım ve orada bir noktada UIView kullandığımdan eminim. Tüm tablo görünümünü kopyalamak, silmek ve tekrar yapıştırmak benim için düzeltti.


7
bu gerçekten çok garip. Bu sorunu çözdü. Bu olduğunda bir fikrin var mı?
MiQUEL

Sanırım 10'13 Ekim'den cevabımı takip ederek çok daha kolay çözebilirsiniz
netshark1000

Aynı sorun vardı. Çıkarma ve okuma da benim için çalıştı.
sma

3
Bildiğim kadarıyla, kaydırma görünümü içerik ekleri otomatik olarak ayarlanır (otomatik olarak varsayılan olarak AdJustsScrollViewInsets = YES ise), kaydırma görünümü görünüm denetleyicisi görünüm hiyerarşisindeki ilk çocuksa. Tahminimce bu çözüm çalışıyor çünkü tablo görünümünü kopyaladıktan sonra artık görünüm hiyerarşisindeki ilk görünüm değil.
lekksi

Olması gereken, tableView görünüme eklediğiniz ilk şey olduğunda, sistemin navigasyon için yer bırakması gerektiğini düşünmesidir. Sanırım burada bazı insanlar tableView ve sonra headerView ekleyin. Bazı sorunlardan sonra, sonra tableView kaldırmak ve tekrar eklemek, o zaman ne olur headerView hiyerarşideki ilk şey, bu yüzden sistem artık adapte olmak zorunda değil, sorun çözüldü. Ben sadece kod kullandığım için biliyorum, bu yüzden benim durumumda ilk başlığı ve sonra düzeltmek için tablo eklemek zorunda kaldı.
Lluis Gerard

40

Film şeridinizdeki tablo görünümünü seçin ve stilin "Gruplandırılmış" yerine "Düz" olarak ayarlandığından emin olun. Bu ayarı Özellik Denetçisi sekmesinde bulabilirsiniz.


inanılmaz .. Bu benim için garip bir çözüm oldu .. Ben sadece tüm görünüm denetleyicisi kopyaladı ve yapıştırdı ama bir şekilde bu yapıştırılan görünüm denetleyicisinin tableView o garip ofset vardı. Bu cevap sorunumu çözdü
daisura99

Bu sorunu çözdü, ancak şimdi başlık bölümleri farklı davranıyor. Kimse?
Bruno Muniz

Seni korusun. Bu dünyanın neresinde olursanız olun. Sonsuza kadar korusun.
gabuchan

9

Benim durumumda UITableView in view hiyerarşisi altında bir UILabel vardı.

Ben "ileri" taşındı ve boşluk ortaya çıktı. Neden olduğundan emin değilim ama böyle çalışıyor, tableView altında bir şey varsa, boş alanı gizler.

Ayrıca film şeridi üzerindeki görünüm denetçisi denetçinizde "Kaydırma Görünümü Eklerini Ayarla" yı işaretlemeyi / işaretini kaldırmayı deneyebilirsiniz.

resim açıklamasını buraya girin


2
Gruplandırılmış bir UITableView var ve "Kaydırma Görünümü Insets Ayarla" çalıştı işaretini kaldırın.
Matt

5

Yukarıdakilerin HİÇBİRİ bana yardımcı olmadı. ancak bunu yapmak yardımcı oldu :

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

'-64' yerine, gezinme çubuğunuzun yüksekliğine bağlı olarak başka bir sayı koyabilirsiniz.


4

Önceden eklenmiş olabilir UIRefreshControl. Bu gibi kod ile bu sorun var:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

Gördüğünüz gibi, self.refreshControllerhemeninit

Ancak, refreshControlkurulumdan sonra ayarlarsanız , üst alan sizi engellemez.

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

Bunun asıl sorun olduğuna inanamıyorum. Bu benim için sadece <= 9.3.5. Bunu dünyada nasıl anladın?
Sirenler

4

Bunu iOS 11'de yapıyorsanız, otomatik olarak AdjustsScrollViewInsets kullanımdan kaldırıldığı için çalışmaz, bu koddaki cevaba göre aşağıdaki kod benim için çalıştı: https://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

Bu yardımcı olur umarım.


4

Film Şeridi 'olarak ayarlamak contentInsets, aramalarınızdan tableviewiçin Never

resim açıklamasını buraya girin


3

Kesin olarak söyleyemem, ancak Prototip Hücrelerin başladığı yer ile UITableView üst kısmı arasında sıkışmış ekstra bir UIView var gibi görünüyor. Eklediğim metni / satırları kaldırırsanız resmim tam olarak size benziyor.

resim açıklamasını buraya girin


3

Üstte bu ekstra alana neyin neden olduğunu hala bilmiyorum, ancak UITableView'u alanla silmenin ve yenisiyle değiştirmenin alanı aldığını gördüm.

Oraya yanlışlıkla bir UIView sürüklemiş olmalıydım, ancak seçemedim, bu yüzden silemedim.


3

Hızlı 5

TableHeaderView ve tableFooterView öğesini kaldırmayı deneyin

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)

2

Film şeridi veya xib'deki tablo görünümü çerçevenizi kontrol edin. Benimki varsayılan olarak ay konum değerine sahiptir, bu nedenle hata


2

Başvurumda da böyle bir sorun yaşadım. TableView sıfır üst kenar iç metin ayarladım. Ayrıca set falseiçin çalıştı automaticallyAdjustsScrollViewInsets. Ama işe yaramadı.

Sonunda çalışan bir çözüm buldum. Bilmiyorum bu doğru yol. Ancak heightForHeaderInSectiondelege yöntemini uygulamak benim için çalıştı. Bunu çalıştırmak için sıfırdan farklı bir değer döndürmeniz gerekir (sıfır döndürme öncekiyle aynı alanı görüntüler).

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 0.1
}

2

2017'de benim için çalışan sadece bu tek satır

navigationController? .navigationBar.isTranslucent = yanlış

Bunun neden etkilediğine dair hiçbir fikrim yok. Belki biri açıklayabilir. Ama eminim ki çoğu insanın aradığı cevap budur.


Bunu benim için de yaptı. Teşekkürler!
scurioni

2

İOS 11 ve sonraki sürümlerinde, apple, içerik ekini ayarlama özelliğini değiştirdi. Kullanım contentInsetAdjustmentBehaviorve set .neveryukarıdaki ekstra alan kaldırmak için UICollectionView, UIScrollView, UITableView.

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

Umarım bu sana yardımcı olmuştur.


1

Peki benim için bir prototip hücre menüden tablo görünümüne sürüklediğimde sorun oluştu. Bu yüzden bunu sildim ve tablo görünümü denetçi özelliklerinde prototip hücresini 1 olarak ayarladım


1

Bunu programlı olarak yapıyorum ve diğer alt görünümlerimi ekledikten sonra sadece addSubview (tableView) alt kısmına taşıdım ve sorunumu çözdü!

Bunun neden sadece simülatörde değil cihazda göründüğünden emin değilim, ama en azından her iki şekilde de basit bir çözüm var!


1

UITableView, görünüm denetleyicisinin ilk alt görünümü olmadığı sürece, boş alan görünmez.

Çözüm: Görünüm denetleyicisinin ilk alt görünümü olarak (UITableView ile aynı düzeyde ancak ondan önce) gizli / net bir görüntüleme nesnesi (görünümler, etiketler, düğme vb.) Ekleyin.


Bunu anlamaya çalışmak için çok fazla zaman harcadım, buradaki ve diğer yayınlardaki önerilerin çoğunu denedim. Bunu çözen budur. Teşekkür ederim! Neden olduğunu açıklayabilir veya bunu yapan bir dokümana bağlantı gönderebilir misiniz? Sadece iOS geliştirmeyi öğreniyorum ve Android'den çok farklı! :)
Mark

0

UIView tablonun üstüne ve altına eklenebilir (sürükle ve bırak). Özelliklerini saydam ve yüksekliği 1 piksel olarak ayarlayın. Bu, hücrelerin önündeki ekstra dolguyu kaldırmaktır.


0

Ben de tableView hiyerarşisinde son görünüm değildi bu sorun vardı. Benim durumumda (onlar birbirleriyle örtüşen olmasa da) yukarıda bir görünüm vardı, bu yüzden hiyerarşide tableView üzerinde sürükledi ve bunu yaptı.


0

Bunun için bir çözüm buldum.

Sadece tableview ve clic editörünü seçin -> Düzenle -> Öne Gönder

Benim için çalıştı ve umarım hepinize yardımcı olur.


0

Benim durumumda, ContainerViewController kullanarak ve UITableViewController içine koyarak. ContainerViewController'ı kaldırdıktan sonra. Sorunlar ortadan kalkar.


0

Xcode 8 hatası…

Storyboard UITableView stiliniz Düz olarak ayarlanmışsa ilk önce bunu deneyin.

Tablonun stilini Gruplanmış olarak ve sonra tekrar Düz olarak ayarlayın. Bu, UITableView'ımın başındaki uygulamamdaki alanı kaldırdı.


0

Benim durumumda bir kap görünümü kullanıyordum. (Ana Görünüm -> Contaner Görünümü -> UITableView)

En üstteki ekstra alan, sanırım, cihaz bildirim çubuğunun alanı (zamanın gösterildiği yerde pil). Gerçekten yapıyorum, bu bir varsayım değil.

UI Builder'dan yaptığım şey:

  • Tablo Görünümü Denetleyicisini tamamla'yı seçin
  • Açık Özellikler denetçisi
  • -> Görünüm Denetleyici -> Düzen -> "Tam Ekran İstiyor" seçeneğini seçin.

0

Bu kodu tablonuzun oluşturulduğu viewDidLoad veya viewDidAppear içinde kullanabilirsiniz:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];


0

ViewController'ın Genişletilmiş Kenarlarını film şeridinde ayarlayın, böylece underTopBarözellik işaretlenmez.


0

Aynı sorunu yaşıyordu. Ben viewDidLoad için aşağıdaki ekleyerek çözdü.

self.extendedLayoutIncludesOpaqueBars = true


-2

kontrol

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • tableview temsilci işlevinden bahset cellForRowAtIndexPath:
  • ios 6 ve 7'yi idare edebilir.
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.