Hapus ruang kosong sebelum sel di UITableView

172

Saat ini saya mencoba untuk meletakkan UITableViewdi lokasi yang berbeda daripada di bagian atas pengontrol tampilan saya. Dengan ini dikatakan, ia mencoba untuk menambahkan header di atas ke akun untuk bilah navigasi, tetapi ini tidak diperlukan karena saya tidak memiliki di bagian atas controller saya.

Jika saya meletakkan sudut kiri atas UITableViewtempat saya ingin sel berada, itu tidak menempatkan sel di sana:

Sekarang, jika saya hanya memindahkan tampilan tabel sehingga sel-sel berada di tempat yang benar, saya mendapatkan masalah yang berbeda - sel-sel dapat dipindahkan ke sana ketika menggulir (ini dengan jari saya di atas pengontrol navigasi):

Saat saya melepaskan, ya - sel akan berada tepat di bawah bilah pencarian, tetapi ini jelas merupakan masalah bagaimana Anda dapat membawanya di atasnya.

Bagaimana saya bisa melakukan ini? Apakah ada cara yang lebih mudah?

hetelek
sumber

Jawaban:

378

Apakah sel-sel UITableViewacara di ruang kosong ketika Anda gulir ke bawah?

Jika demikian, maka masalahnya mungkin inset yang ditambahkan ke UITableViewkarena pengontrol Navigasi yang Anda miliki di tampilan Anda. Inset ditambahkan ke tampilan tabel agar konten dapat ditempatkan di bawah bilah navigasi ketika tidak ada gulir yang terjadi. Ketika tabel digulir, konten akan bergulir dan ditampilkan di bawah bilah navigasi transparan. Perilaku ini tentu saja diinginkan hanya jika tampilan tabel dimulai langsung di bawah bilah navigasi, yang tidak terjadi di sini.

Satu hal yang perlu diperhatikan adalah bahwa iOS menyesuaikan inset konten hanya untuk tampilan pertama dalam hierarki tampilan jika itu UIScrollViewturunan atau turunan (misalnya UITableViewdan UICollectionView). Jika hierarki tampilan Anda mencakup banyak tampilan gulir, automaticallyAdjustsScrollViewInsetsakan membuat penyesuaian hanya untuk yang pertama.

Berikut cara mengubah perilaku ini:

a) Pembuat Antarmuka

  • Pilih pengontrol tampilan
  • Inspektur Atribut Terbuka
  • Ada properti yang disebut "Sesuaikan insets tampilan gulir" di inspektur atribut IB (ketika pengontrol tampilan dipilih) yang aktif secara default. Hapus centang opsi ini:


    (Gambar milik Dheeraj D )

Saya tidak yakin versi Xcode mana yang memperkenalkan opsi ini (tidak menemukannya dalam catatan rilis), tetapi setidaknya tersedia dalam versi 5.1.1.

Sunting: Untuk menghindari kebingungan, ini adalah opsi ketiga yang disebutkan dalam komentar

b) Secara terprogram

Tambahkan ini ke yaitu viewDidLoad(kredit untuk jawaban Slavco Petkovski dan komentar Cris R )

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) Ini mungkin relevan untuk anak sekolah tua

Anda dapat memperbaikinya dengan menambahkan

tableView.contentInset = UIEdgeInsetsZero

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

Atau jika Anda menggunakan IB dan jika bilah navigasi tidak transparan (tidak dapat membedakan dari tangkapan layar)

  • Pilih pengontrol tampilan
  • Inspektur Atribut Terbuka
  • Di opsi Tampilan Pengendali Perpanjang Tepi bagian hapus centang "Di Bawah Bilah Atas"
lekksi
sumber
2
Tidak memilih "Under Top Bars" pada UIView bekerja dengan baik untuk saya. Terima kasih.
Andreas Øverland
Saya menjadi gila menggunakan "Paging Diaktifkan" dan gulir hanya bergeser oleh ketinggian bilah navigasi bukan seluruh sel. Terima kasih.
LordParsley
8
Opsi ketiga: batalkan pilihan "Sesuaikan insets tampilan gulir" - berfungsi seperti pesona. terima kasih lekksi!
Stas Zhukovskiy
2
self.automaticallyAdjustsScrollViewInsets = false di Swift "de pelos" yang bekerja!
Cris R
1
Terima kasih pengaturan UIEdgeInsetsZero diperlukan jika menggunakan kembali tabel di pengontrol tabel baru setiap kali ditunjukkan sebaliknya celah putih yang sama muncul dan semakin besar.
Malhal
71

Saya memiliki masalah yang sama dan saya cukup yakin saya memiliki UIView di sana pada satu titik. Cukup menyalin seluruh tampilan tabel, menghapusnya, dan menempelkannya lagi untuk saya.

tidak berwarna biru
sumber
7
ini benar-benar aneh. Ini memecahkan masalah. Adakah yang tahu kapan ini terjadi?
MiQUEL
Saya pikir Anda bisa menyelesaikannya lebih mudah dengan mengikuti jawaban saya dari 10 Oktober 13
netshark1000
Punya masalah yang sama. Menghapusnya dan membaca juga bekerja untuk saya.
sma
3
Sejauh yang saya tahu, insets konten tampilan gulir disesuaikan secara otomatis (jika secara otomatisAdjustsScrollViewInsets = YA, yang secara default adalah) hanya jika tampilan gulir adalah anak pertama dalam hierarki tampilan pengontrol tampilan. Dugaan saya adalah solusi ini berfungsi karena setelah menyalin tampilan tabel, ini bukan lagi tampilan pertama dalam hierarki tampilan.
lekksi
Apa yang terjadi adalah ketika tableView adalah hal pertama yang Anda tambahkan ke tampilan, sistem berpikir bahwa ia harus meninggalkan ruang untuk navigasi. Tebakan saya di sini adalah bahwa beberapa orang menambahkan tableView dan kemudian headerView. Setelah beberapa masalah, mereka kemudian menghapus tableView dan menambahkannya lagi, yang terjadi kemudian adalah headerView adalah hal pertama pada hierarki, sehingga sistem tidak perlu beradaptasi lagi, masalah terpecahkan. Saya tahu karena saya hanya menggunakan kode, jadi dalam kasus saya harus menambahkan dulu header dan kemudian tabel untuk memperbaikinya.
Lluis Gerard
40

Pilih tampilan tabel di storyboard Anda dan pastikan gaya diatur ke "Plain", bukan "Dikelompokkan". Anda dapat menemukan pengaturan ini di tab Inspektur atribut.

netshark1000
sumber
luar biasa .. ini adalah solusi bagi saya aneh .. Saya baru saja menyalin dan menempelkan seluruh tampilan controller tapi entah bagaimana tableView ini ditempelkan controller tampilan memiliki offset yang aneh. Jawaban ini memecahkan masalah saya
daisura99
Ini memecahkan masalah tetapi sekarang bagian tajuk berperilaku berbeda. Siapa saja?
Bruno Muniz
Diberkatilah Anda. Dimanapun Anda berada di dunia ini. Memberkati kamu selamanya.
gabuchan
9

Dalam Kasus Saya, saya memiliki label UIL di bawah hierarki tampilan UITableView in view.

Saya memindahkannya "maju" dan ruang kosong muncul. Tidak yakin mengapa tetapi berfungsi seperti ini, jika ada sesuatu di bawah tableView, itu menyembunyikan ruang kosong.

Anda juga dapat mencoba memeriksa / menghapus tanda centang "Sesuaikan Tampilan Gulir Lihat" pada inspektur pengontrol tampilan Anda di storyboard.

masukkan deskripsi gambar di sini

Andre Cytryn
sumber
2
Saya memiliki UITableView yang dikelompokkan dan menghapus centang "Sesuaikan Scroll View Insets".
Matt
5

TIDAK ada yang di atas yang membantu saya. tetapi melakukan ini memang membantu :

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

alih-alih '-64' Anda dapat memasukkan nomor lain tergantung pada ketinggian bilah navigasi Anda.

Tung Fam
sumber
4

Mungkin ada yang ditambahkan sebelumnya UIRefreshControl. Saya punya masalah dengan kode seperti ini:

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

}

Seperti yang Anda lihat, saya atur self.refreshControllersegera setelahnyainit

Tetapi, jika Anda mengatur refreshControlsetelah pengaturan, maka ruang atas tidak mengganggu Anda.

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;
}
alias kualitas
sumber
Saya tidak percaya ini adalah masalah sebenarnya. Ini hanya masalah bagi saya di <= 9.3.5. Bagaimana di dunia ini Anda mengetahui hal ini?
Sirene
4

Jika Anda melakukan ini di iOS 11, secara otomatisAdjustsScrollViewInsets tidak akan berfungsi karena sudah usang, kode berikut ini berfungsi untuk saya sesuai dengan jawaban di posting ini: https://stackoverflow.com/a/44391269/5476481

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

Semoga ini membantu.

Jacobo Koenig
sumber
4

Di Storyboard, atur contentInsetsmilik Anda tableviewke Never

masukkan deskripsi gambar di sini

Marwen Doukh
sumber
3

Saya tidak bisa mengatakan dengan pasti tetapi sepertinya Anda punya UIView tambahan yang terjebak di mana Sel Prototipe dimulai dan bagian atas UITableView. Gambar saya persis seperti milik Anda jika Anda menghapus teks / baris yang saya tambahkan.

masukkan deskripsi gambar di sini

Mike S
sumber
3

Saya masih tidak yakin apa yang menyebabkan ruang ekstra di bagian atas, tetapi saya menemukan bahwa menghapus UITableView dengan ruang dan menggantinya dengan yang baru mengambil ruang itu.

Saya pasti telah menyeret UIView ke sana secara tidak sengaja, tetapi saya tidak dapat memilihnya sehingga saya tidak dapat menghapusnya.

hetelek
sumber
3

Cepat 5

Coba dengan menghapus tableHeaderView dan tableFooterView

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

Periksa frame tampilan meja Anda di storyboard atau xib. Milik saya secara default memiliki nilai posisi, maka bug

Arthi
sumber
2

Dalam aplikasi saya juga saya pernah mengalami masalah seperti ini. Saya telah menetapkan inset tepi atas tableView nol. Juga mencoba mengatur falseuntukautomaticallyAdjustsScrollViewInsets . Tetapi tidak berhasil.

Akhirnya saya mendapat solusi kerja. Saya tidak tahu apakah ini cara yang benar. Tetapi menerapkan heightForHeaderInSectionmetode delegasi berhasil bagi saya. Anda harus mengembalikan nilai bukan nol untuk mengerjakan ini (return zero akan menampilkan ruang yang sama seperti sebelumnya).

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

    return 0.1
}
Anusha Kottiyal
sumber
2

Pada 2017, apa yang bekerja untuk saya hanyalah baris ini

navigationController? .navigationBar.isTranslucent = false

Saya tidak tahu mengapa itu akan memengaruhinya. Mungkin seseorang bisa menjelaskan. Tapi saya cukup yakin ini adalah jawaban yang akan dicari kebanyakan orang.

Waktu Embun
sumber
Itu juga melakukannya untuk saya. Terima kasih!
scurioni
2

Di iOS 11 dan di atasnya, apple telah mengubah properti untuk menyesuaikan inset konten. Gunakan contentInsetAdjustmentBehaviordan mengatur .neveruntuk menghapus ruang ekstra di atas 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
}

Saya harap ini akan membantu Anda.

Mayur Karmur
sumber
1

Bagi saya masalah terjadi ketika saya menyeret sel prototipe dari menu ke tampilan tabel. Jadi saya menghapus itu dan hanya mengatur sel prototipe ke 1 di properti tampilan tabel inspektur

Junaid Ahmed
sumber
1

Saya melakukan ini secara terprogram, dan saya hanya memindahkan addSubview (tableView) saya ke bawah setelah menambahkan semua subview saya yang lain, dan itu menyelesaikan masalah saya!

Tidak yakin mengapa ini hanya muncul di perangkat dan bukan di simulator saya, tapi setidaknya ada solusi sederhana!

Austin Whitelaw
sumber
1

Selama UITableView bukan subview pertama dari pengontrol tampilan, ruang kosong tidak akan muncul.

Solusi: Tambahkan objek tampilan tersembunyi / jelas (tampilan, label, tombol, dll.) Sebagai subview pertama dari pengontrol tampilan (pada tingkat yang sama dengan UITableView tetapi sebelumnya).

jr.ong
sumber
Saya menghabiskan banyak waktu untuk mencari tahu, mencoba banyak saran di sini dan di posting lain. Ini adalah salah satu yang menyelesaikannya. Terima kasih! Bisakah Anda menjelaskan mengapa atau memposting tautan ke beberapa dokumen yang melakukannya? Saya baru belajar dev iOS dan sangat berbeda dari Android! :)
Tandai
0

UIView dapat dimasukkan di bagian atas dan bawah tabel (seret dan lepas). Atur propertinya transparan dan tinggi 1 px. Ini untuk menghilangkan lapisan tambahan di depan sel.

Alexander
sumber
0

Saya juga punya masalah ini tableView bukan tampilan terakhir dalam hierarki. Dalam kasus saya, saya memiliki pandangan di atas (meskipun mereka tidak tumpang tindih satu sama lain), jadi saya menyeretnya di atas tableView dalam hierarki dan itu membuatnya.

Sebyddd
sumber
0

Saya baru saja menemukan solusi untuk ini.

Cukup pilih tableview dan klik Editor -> Atur -> Kirim ke Depan

Itu bekerja untuk saya dan berharap itu membantu Anda semua.

Daniel Meza
sumber
0

Dalam kasus saya, saya menggunakan ContainerViewController dan meletakkan UITableViewController di dalamnya. Setelah menghapus ContainerViewController. Masalah hilang.

Sandeep Ahuja
sumber
0

Bug Xcode 8 ...

Coba ini dulu jika gaya Storyboard UITableView Anda diatur ke Plain.

Setel gaya tabel ke Dikelompokkan lalu kembali ke Plain. Ini menghapus ruang di aplikasi saya di bagian atas UITableView saya.

Carl
sumber
0

Dalam kasus saya, saya menggunakan tampilan kontainer. (Tampilan Utama -> Tampilan Contaner -> UITableView)

Ruang tambahan di bagian atas, saya pikir, seperti ruang bilah notifikasi perangkat (di mana waktu ditampilkan, baterai). Saya benar-benar melakukannya, itu bukan asumsi.

Apa yang saya lakukan adalah dari Pembuat UI:

  • pilih Pengendali Tampilan Tabel selesai
  • Inspektur Atribut Terbuka
  • Pergi ke -> View Controller -> Layout -> "Select Wants Full Screen"
Patricio Diego
sumber
0

Anda dapat menggunakan kode ini ke viewDidLoad atau viewDidAppear tempat meja Anda dibuat:

// 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];
Vinod Joshi
sumber
0

I just found a solution for this. In my case, i was using TabBarViewController, A just uncheck the option 'Adjust Scroll View Insets'. Issues goes away. https://i.stack.imgur.com/vRNfV.png

NitinLandge
sumber
0

atur Tepi Tambahan ViewController di storyboard sehingga underTopBarproperti tidak dicentang.

JAHelia
sumber
0

Sedang mengalami masalah yang sama. Saya menyelesaikannya dengan menambahkan berikut ini ke viewDidLoad.

self.extendedLayoutIncludesOpaqueBars = true
Kode GIJoe
sumber
-1

Atur inset konten ke nol:

sriram neelamegam
sumber
-2

cek untuk

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • menyebutkan fungsi delegasi tableview cellForRowAtIndexPath:
  • dapat menangani ios 6 dan 7.
Manikandan
sumber