Mulai di iOS7, ada ruang tambahan di bagian atas saya UITableView
yang memiliki gaya UITableViewStyleGrouped
.
Berikut ini sebuah contoh:
Tableview dimulai pada panah pertama, ada 35 piksel padding yang tidak dapat dijelaskan, kemudian header hijau UIView
dikembalikan oleh viewForHeaderInSection
(di mana bagian tersebut 0).
Adakah yang bisa menjelaskan dari mana jumlah 35 piksel ini berasal dan bagaimana saya bisa menyingkirkannya tanpa beralih ke UITableViewStylePlain
?
catatan:
Di iOS 11 dan yang lebih baru:
tableView.contentInsetAdjustmentBehavior = .never
ios
uitableview
ios7
esilver
sumber
sumber
UITableView
tidak suka diberi tajuk dengan ketinggian 0,0. Periksa stackoverflow.com/a/31223403/1394534 untuk detail lebih lanjut.self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];
Catatan: diabaikan0.0f
saja jika Anda menggunakannya di ketinggian kotak. Jadi kami menggunakan CGFloat terdekat ke nol yang mungkin (setidaknya ini "bekerja" untuk saya ... hanya bukan solusi ideal).Jawaban:
Saya dibantu oleh yang berikut:
YouStoryboard.storyboard> YouViewController> Inspektur atribut> Hapus centang - Sesuaikan insets tampilan gulir.
sumber
collectionview
. (Ketika tableview ada di dalamcollectionviewcell
)Saya bermain-main dengannya sedikit lebih dan sepertinya ini adalah efek samping dari pengaturan tableView
tableHeaderView = nil
.Karena tableView saya memiliki tampilan yang dinamis
tableHeaderView
, ketika saya harus menyembunyikantableHeaderView
, alih-alih melakukanself.tableView.tableHeaderView = nil;
, saya lakukan:Saya suka solusi ini lebih baik daripada pengaturan yang agak arbitrer
contentInset.top
karena saya menggunakancontentInset.top
secara dinamis juga. Harus ingat untuk menghapus 35px tambahan setiap kali saya menghitung ulangcontentInset.top
itu membosankan.sumber
Debug > Color Misaligned Images
simulator untuk melihat ini sendiri.) Anda tidak ingin melakukan itu.UITableViewHeaderFooterView
daripada UIView. DanCGFLOAT_MIN
bekerja sama0.01f
tetapi lebih baik dalam teori.Untuk iOS 7 jika Anda mengalokasikan tampilan tabel dalam pengontrol tampilan Anda mungkin melihat
masalah Anda sepertinya mirip dengan masalah saya
Memperbarui:
Swift di iOS 9.x:
Swift 3:
sumber
UITableView
. Masalahnya berasal dari fakta sayaUITableView
berada diUIViewController
dalamUINavigationController
yang menyebabkan konten tabel turun 44 poin sehingga konten awal tidak naik di belakangnavBar
. Itu tidak diperlukan dengan tata letak saya, jadi itu hanya menyebabkan masalah. Akhirnya saya mengubah kode sayaautomaticallyAdjustsScrollViewInsets
yang juga berfungsi.edgesForExtendedLayout = []
Coba ubah
contentInset
properti yangUITableView
mewarisi dariUIScrollView
.Ini solusinya, tetapi berhasil
sumber
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);
bekerja paling baik untuk saya karena ada 20 piksel tambahan di bagian atas dan bawah.coba, Anda bisa mengatasinya!
sumber
uncheck Adjust scroll view insets
. Karena terkadang kami tidak menggunakan storyboard untuk membangun UI kami.Anda dapat mendeteksi apakah aplikasi Anda menjalankan iOS7 atau lebih besar dan menambahkan dua metode ini dalam delegasi tampilan tabel Anda (biasanya dalam kode UIViewController Anda)
Ini mungkin bukan solusi yang elegan tetapi bekerja untuk saya
Versi cepat:
sumber
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Saya telah menemukan penyebab bug asli saya dan membuat contoh proyek yang menunjukkannya. Saya percaya ada bug iOS7.
Pada iOS7, jika Anda membuat UITableView dengan gaya yang dikelompokkan, tetapi tidak memiliki delegasi ditetapkan pada tata letak pertama, maka Anda menetapkan delegasi dan memanggil reloadData, akan ada ruang 35px di bagian atas yang tidak akan pernah hilang.
Lihat proyek ini yang saya buat menampilkan bug: https://github.com/esilverberg/TableViewDelayedDelegateBug
Khususnya file ini: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m
Jika saluran 24 aktif,
akan ada ruang 35 px tambahan di bagian atas. Jika saluran 27 aktif dan 24 dikomentari,
tidak ada ruang di bagian atas. Ini seperti tableView sedang menyimpan hasil di suatu tempat dan tidak menggambar ulang sendiri setelah delegasi diatur dan reloadData dipanggil.
sumber
tableView:heightForHeaderInSection:
dantableView:heightForFooterInSection:
mengembalikan 0 Anda juga akan memiliki masalah ini. Menerapkan metode protokol di atas DAN mengembalikan 0.01f memperbaikinya untuk saya.Hapus centang "Sesuaikan insets Tampilan Gulir"
sumber
Komentar cepat lain ... bahkan di XCode 6.1, ada bug dengan ruang vertikal muncul di bagian atas
UIScrollViews
,UITextViews
danUITableViews
.Terkadang, satu-satunya cara untuk memperbaiki masalah ini adalah masuk ke Storyboard dan seret kontrol masalah sehingga tidak lagi menjadi subview pertama pada halaman.
(Terima kasih untuk Oded karena mengarahkan saya ke arah ini ... Saya memposting komentar ini, hanya untuk menambahkan beberapa tangkapan layar, untuk menunjukkan gejala dan memperbaikinya.)
sumber
Menurut panduan transisi ini untuk iOS7 oleh Apple, inset konten tampilan gulir secara otomatis disesuaikan. Nilai default secara otomatisAdjustsScrollViewInsets diatur ke YES.
UIViewController yang memiliki UITableView harus mengatur properti ini menjadi NO.
Ini akan melakukan triknya.
EDIT 1:
Juga, orang bisa mencoba -
Ini juga menghilangkan bantalan ekstra di atas.
sumber
Saat menggunakan TableView yang dikelompokkan, gunakan ini untuk menghindari pemotongan tepi di viewWillAppear
sumber
Banyak jawaban sebelumnya di atas terlalu berantakan. Mereka akan pecah kapan saja di masa depan jika Apple memutuskan untuk memperbaiki perilaku tak terduga ini.
Akar masalah:
a
UITableView
tidak suka memiliki header dengan ketinggian 0,0. Jika yang ingin Anda lakukan adalah memiliki tajuk dengan tinggi 0, Anda dapat melompat ke solusinya.bahkan jika nanti Anda menetapkan tinggi bukan 0,0 untuk header Anda, a
UITableView
tidak suka ditugaskan header dengan tinggi 0,0 pada awalnya.Larutan:
Kemudian, perbaikan paling sederhana dan dapat diandalkan adalah untuk memastikan bahwa tinggi header Anda bukan 0 ketika Anda menetapkannya untuk tampilan tabel Anda.
Sesuatu seperti ini akan berhasil:
Sesuatu seperti ini akan menyebabkan masalah di beberapa titik (biasanya, setelah gulir):
sumber
tableView.tableHeaderView
sebenarnya adalah tampilan aksesori di atas konten baris. Saya bingung dengan header bagian sampai jawaban Anda keluar.CGFLOAT_MIN
telah diganti denganCGFloat.leastNormalMagnitude
di Swift 3Storyboard:
Hapus centang:
Adjust Scroll View Insets
pada opsi View Controller'sKode:
sumber
Ini adalah solusi untuk iOS 10 menggunakan Swift 3:
Anda dapat menyingkirkan bantalan atas dan bawah dengan menerapkan metode berikut dari menu
UITableViewDelegate
.sumber
Dalam kasus saya inilah yang membantu saya. Saya mendukung ios6 juga.
sumber
Cukup tambahkan berikut ini ke viewDidLoad Anda di VC Anda:
sumber
Jadi saya mencoba setiap metode di sini, dan kali ini tidak ada yang membantu. Kasus saya adalah tampilan tabel dikelompokkan pada iOS 9. Saya tidak benar-benar tahu mengapa dan bagaimana saya menemukan ini, tetapi bagi saya, pengaturan
tableViewHeader
denganUIView
dengan setidaknya0.01
ketinggian berhasil.CGRectZero
tidak membantu, tidak ada yang benar-benar membantu:sumber
Swift: iOS saya melihat tabel pada tampilan gulir .. ketika saya klik "Kembali" pada layar yang sama. Tampilan gulir mengambil lebih banyak ruang di atas .. untuk mengatasi ini saya telah menggunakan:
Nilai Boolean yang menunjukkan apakah pengontrol tampilan harus secara otomatis menyesuaikan inset tampilan gulirnya. Nilai defaultnya benar, yang memungkinkan pengontrol tampilan untuk menyesuaikan inset tampilan gulirnya sebagai respons terhadap area layar yang dikonsumsi oleh bilah status, bilah navigasi, dan bilah alat atau bilah tab. Setel ke false jika Anda ingin mengatur sendiri penyesuaian inset tampilan gulir, seperti ketika ada lebih dari satu tampilan gulir dalam hierarki tampilan.
sumber
Terima kasih atas jawabannya oleh @ Aurelien Porte. Ini solusinya
Penyebab masalah ini: -
Di ViewDidLoad: -
Tidak Perlu Untuk Sesuatu Seperti Ini: -
Dalam
heightForHeaderInSection
delegasi: -Dalam
viewForHeaderInSection
delegasi: -sumber
Ini adalah cara memperbaiki dengan mudah di iOS 11 dan Xcode 9.1 melalui Storyboard:
Pilih Tampilan Tabel> Pemeriksa Ukuran> Isi Konten: Jangan
sumber
automaticallyAdjustsScrollViewInsets
di ios 11Saya berasumsi itu hanya bagian dari
UITableViewStyleGrouped
gaya baru . Itu ada di semua tampilan tabel yang dikelompokkan dan sepertinya tidak ada cara langsung untuk mengendalikan ruang itu.Jika ruang yang diwakili oleh
UIView
, akan mungkin untuk mencari melalui semuasubviews
dariUITableView
untuk menemukan bahwa melihat dan mengedit langsung tertentu. Namun, ada juga kemungkinan bahwa ruang itu hanya offset hardcoded sebelum header dan sel mulai dan tidak akan ada cara untuk mengeditnya.Untuk mencari melalui semua subview (Saya akan menjalankan kode ini ketika tabel tidak memiliki sel, untuk membuatnya sedikit lebih mudah untuk membaca output):
sumber
UITableViewCellScrollView
) di iOS7 telah mengajarkan kita satu hal, itu meninggalkan hirarki tampilan dibangun di kelas saja.po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]
Anda akan melihat bahwa tajuk tabel, atau tajuk bagian pertama, atau sel pertama (tergantung pada apa yang Anda gunakan) secara alami meninggalkan batas 35px .... boo.Jawaban saya akan menjadi jawaban yang lebih umum, tetapi dapat diterapkan pada ini juga.
Jika tampilan root (dari ViewController ) atau anak pertama (subview) dari tampilan root adalah subkelas dari UIScrollView (atau UIScrollView sendiri), dan jika
framework akan secara otomatis mengatur contentInset yang sudah dihitung sebelumnya .
Untuk menghindarinya bisa Anda lakukan
tetapi dalam kasus saya, saya tidak dapat melakukan ini, karena saya mengimplementasikan SDK yang memiliki komponen UIView yang dapat digunakan oleh pengembang lain. Komponen UIView itu berisi UIWebView (yang memiliki UIScrollView sebagai subview pertama). Jika komponen itu ditambahkan sebagai anak pertama dalam hierarki tampilan UIViewController, inset otomatis akan diterapkan oleh sistem.
Saya telah memperbaiki ini dengan menambahkan tampilan dummy dengan bingkai (0,0,0,0) sebelum menambahkan UIWebView.
Dalam hal ini sistem tidak menemukan subclass dari UIScrollView sebagai subview pertama dan tidak menerapkan insets
sumber
self.automaticallyAdjustsScrollViewInsets = false
Kode ini bekerja untuk saya, Jawaban terbaik bagi saya yang ditulis di
objective-C
atas sehingga saya mengubahnya menjadi Swift.Tulis saja ini
viewDidLoad()
dan itu akan bekerja seperti pesona.sumber
Saya memiliki perbaikan yang sama dengan arielyz. Setelah saya memindahkan UITableView menjadi bukan subview pertama dari tampilan induk, itu hilang. Ruang saya adalah 20 px, bukan 35.
Saya tidak dapat membuatnya dalam potret xib, hanya lanskap xib. Saya akan mengajukan bug radar nanti jika saya bisa mereproduksinya dalam aplikasi demo sederhana.
sumber
Saya pikir membuat UIEdgeInsets -35 0 0 0 membosankan. Dalam kasus saya, saya menerapkan metode tableView: heightForHeaderInSection: dan memiliki potensi untuk mengembalikan 0.
Ketika saya mengubah 0 ke 0.1f, masalahnya hilang begitu saja.
sumber
Satu-satunya hal yang berhasil bagi saya adalah:
Cepat :
Tujuan-C :
Juga, saya masih punya ruang ekstra untuk bagian pertama. Itu karena saya salah menggunakan
tableHeaderView
properti. Memperbaikinya juga dengan menambahkan:sumber
Kode Swift 4: Untuk tampilan tabel tanpa header bagian, Anda dapat menambahkan kode ini:
dan Anda akan mendapatkan jarak tajuk ke 0.
Jika Anda ingin tajuk tinggi spesifik Anda lulus nilai itu:
dan tampilan dari delegasi viewForHeaderinSection.
sumber
Untuk lebih spesifik, untuk menghapus ruang tableviewHeader dari atas saya membuat perubahan ini:
YouStoryboard.storyboard> YouViewController> Pilih TableView> Pemeriksa ukuran> Insets konten - Atur agar tidak pernah.
sumber
gunakan yang ini saya pikir ini bantuan ...
sumber
sumber