Mengapa ada padding tambahan di bagian atas UITableView saya dengan gaya UITableViewStyleGrouped di iOS7

637

Mulai di iOS7, ada ruang tambahan di bagian atas saya UITableViewyang memiliki gaya UITableViewStyleGrouped.

Berikut ini sebuah contoh:

masukkan deskripsi gambar di sini

Tableview dimulai pada panah pertama, ada 35 piksel padding yang tidak dapat dijelaskan, kemudian header hijau UIViewdikembalikan 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
esilver
sumber
apakah Anda menggunakan iOS 7 terbaru? Beberapa JENIS inkonsistensi (tapi tidak semua, dan mungkin tidak yang ini) telah sembuh selama dalam preview dev berikutnya. Saya harus tahu: Saya banyak menunda-nunda beberapa masalah menghilang.
Dan Rosenstark
Periksa jawaban di sini - stackoverflow.com/a/18986158/1463604
Nishant
Jawaban singkatnya adalah bahwa bantalan tambahan ini mungkin karena tajuk tampilan tabel (bukan tajuk bagian), dan yang UITableViewtidak suka diberi tajuk dengan ketinggian 0,0. Periksa stackoverflow.com/a/31223403/1394534 untuk detail lebih lanjut.
Aurelien Porte
30
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).
Alejandro Iván
1
@ AlejandroIván komentar Anda baru saja membuat malam saya. Saya punya tableView dengan prototipe yang dikelompokkan. Saya menggunakan numberSections = data.count dan pengaturan numberRows = 1. Saya mengatur heightForFooterInSection untuk membuat ruang bersih di antara masing-masing dan untuk beberapa alasan tableHeaderView kosong muncul.
Ryan Alexander

Jawaban:

863

Saya dibantu oleh yang berikut:

YouStoryboard.storyboard> YouViewController> Inspektur atribut> Hapus centang - Sesuaikan insets tampilan gulir.

masukkan deskripsi gambar di sini

Alexander
sumber
42
Saya pikir ini adalah cara yang benar untuk menghapus padding itu, daripada merusak nilai edgeInset.
Hgeg
21
Ini tidak berhasil untuk saya - saya memiliki navBar buram di atas dan ini dimatikan mendorong konten di bawahnya.
slycrel
5
Tidak berfungsi saat menggunakan kustom collectionview. (Ketika tableview ada di dalam collectionviewcell)
Akshit Zaveri
5
Tidak bekerja untuk saya; Satu-satunya hal yang berhasil adalah beralih ke Plain alih-alih Dikelompokkan
shim
28
Saya punya masalah dengan TableViewController di dalam tampilan kontainer. Saya harus mengatur properti ini tidak secara langsung pada TableViewController yang tertanam, tetapi pada pengontrol tampilan yang berisi tampilan kontainer. Lalu berhasil.
Andy Mortimer
326

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 menyembunyikan tableHeaderView, alih-alih melakukan self.tableView.tableHeaderView = nil;, saya lakukan:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

Saya suka solusi ini lebih baik daripada pengaturan yang agak arbitrer contentInset.topkarena saya menggunakan contentInset.topsecara dinamis juga. Harus ingat untuk menghapus 35px tambahan setiap kali saya menghitung ulang contentInset.topitu membosankan.

Tuan T
sumber
4
Solusi hebat! Memang, Anda harus mengaturnya ke 0.01f untuk menyingkirkan tampilan header tampilan tabel default seperti dalam kode Anda.
Simone Manganelli
2
BTW, ini juga mungkin dilakukan dengan satu drag & drop di Interface Builder. Bagaimanapun, terima kasih! :)
Rudolf Adamkovič
8
Anda Tuan pantas mendapatkan medali untuk ini
Vaibhav Gautam
7
Ingatlah bahwa tampilan ketinggian 0,01f di bagian atas tampilan tabel Anda akan berarti semua sel beaneath tidak selaras (sel pertama dengan asal Y 0,01, sel_height + 0,01, dll) selanjutnya isi sel-sel tersebut akan tidak selaras. (Nyalakan Debug > Color Misaligned Imagessimulator untuk melihat ini sendiri.) Anda tidak ingin melakukan itu.
Simon Whitaker
2
Lebih baik menggunakan UITableViewHeaderFooterViewdaripada UIView. Dan CGFLOAT_MINbekerja sama 0.01ftetapi lebih baik dalam teori.
Jaybo
178

Untuk iOS 7 jika Anda mengalokasikan tampilan tabel dalam pengontrol tampilan Anda mungkin melihat

self.edgesForExtendedLayout = UIRectEdgeNone;

masalah Anda sepertinya mirip dengan masalah saya

Memperbarui:

Swift di iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
yeahdixon
sumber
3
Bekerja di dataran saya UITableView. Masalahnya berasal dari fakta saya UITableViewberada di UIViewControllerdalam UINavigationControlleryang menyebabkan konten tabel turun 44 poin sehingga konten awal tidak naik di belakang navBar. Itu tidak diperlukan dengan tata letak saya, jadi itu hanya menyebabkan masalah. Akhirnya saya mengubah kode saya automaticallyAdjustsScrollViewInsetsyang juga berfungsi.
DBD
Properti ini hanya diterapkan untuk melihat pengontrol yang tertanam dalam wadah seperti UINavigationController. Pengontrol tampilan root jendela tidak bereaksi terhadap properti ini. Nilai default dari properti ini adalah semuanya. ..Saya Rasanya defaultnya adalah 0? Di mana hal ini memiliki keuntungan.
Desh_
5
Lebih elegan dengan Swift 3:edgesForExtendedLayout = []
Dave Batton
Hello @yeahdixon Perangkat lunak apa yang Anda gunakan untuk membuat panah merah muda? terima kasih sebelumnya
iArezki
175

Coba ubah contentInsetproperti yang UITableViewmewarisi dari UIScrollView.

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

Ini solusinya, tetapi berhasil

nvrtd frst
sumber
6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);bekerja paling baik untuk saya karena ada 20 piksel tambahan di bagian atas dan bawah.
Brian
1
Meskipun solusi "brute force" ini bekerja, saya pikir yang paling bawah (khususnya inset yang secara otomatis menyesuaikan) harus berperingkat lebih tinggi.
eladleb
134
self.automaticallyAdjustsScrollViewInsets = NO;

coba, Anda bisa mengatasinya!

guanhuiwit
sumber
Ini bagus untuk menyembunyikan tableHeaderView di iOS 7.0, tetapi tidak didukung di versi yang lebih lama.
Brian
Bekerja sangat baik di bawah iOS 7.
StackRunner
3
Penting: Pastikan Anda melakukan ini di pengontrol tampilan wadah, jika UITableView Anda ditempatkan pada pengontrol yang kemudian disematkan ke pengontrol lain, lakukan ini di pengontrol teratas penyematan, bukan langsung di mana Anda meletakkan UITableView (di mana AutoLayout akan urus semuanya).
James Stone
Ini lebih baik daripada uncheck Adjust scroll view insets. Karena terkadang kami tidak menggunakan storyboard untuk membangun UI kami.
JW.ZG
Ini bekerja untuk saya. Saya melampirkan tampilan ke bilah navigasi dan tampilan tabel, itu tidak terjadi di iOS 11, tetapi terjadi di iOS 10. Terima kasih.
dobiho
78

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)

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

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

Ini mungkin bukan solusi yang elegan tetapi bekerja untuk saya

Versi cepat:

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

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
LightMan
sumber
1
Ini berhasil untuk saya. UITableView menambahkan ruang di atas karena banyak alasan berbeda. Khususnya, terkait dengan OP, masalahnya hanya terjadi untuk tampilan tabel gaya yang dikelompokkan. Dan solusi ini memperbaiki masalahnya.
RajV
5
Anda dapat menggunakan CGFLOAT_MIN alih-alih 0,001 itu memberi Anda nilai absolut terkecil CGFloat.
eiKatte
2
Ini adalah jawaban yang benar karena fitur sebenarnya adalah padding hanya ada di tampilan tabel gaya yang dikelompokkan dan diabaikan jika Anda menentukan header / footer
Jakub Truhlář
Ini harus ditandai sebagai jawaban yang benar. Metode delegasi untuk mengganti dan menjawab pertanyaan. Setidaknya coba ini dulu jika Anda membaca ini semua hacks. Coba tweeting: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: (NSInteger) bagian {// return CGFLOAT_MIN; kembalikan 30.0f; }
Matthew Ferguson
Bagus! Sebagai bonus, jika Anda ingin tajuk kecil di bagian atas dan lebih banyak di antara bagian yang dikelompokkan, Anda dapat menggunakan yang berikut:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders
55

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,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

akan ada ruang 35 px tambahan di bagian atas. Jika saluran 27 aktif dan 24 dikomentari,

self.tableView.delegate = self;

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.

esilver
sumber
21
Saya akan menambahkan bahwa bahkan jika ada delegasi tetapi delegasi tableView:heightForHeaderInSection:dan tableView:heightForFooterInSection:mengembalikan 0 Anda juga akan memiliki masalah ini. Menerapkan metode protokol di atas DAN mengembalikan 0.01f memperbaikinya untuk saya.
John Estropia
1
IYA!! Saya sudah mencoba 3 solusi yang disebut, dan ini adalah satu! Brilliant, terima kasih: D
Henrik Erlandsson
sempurna. Siapa pun melaporkan bug karena saya pikir ini bukan perilaku yang dimaksudkan.
Pushparaj
temukan! Ini masih terjadi di ios 9 (kami tidak menggunakan XIB) tetapi menetapkan delegasi di init memperbaiki spasi (tidak di loadView atau viewDIdLoad). Terima kasih!
John Stricker
1
Pengaturan estimasiHeight untuk header membantu saya
Viktor
49

Hapus centang "Sesuaikan insets Tampilan Gulir"

masukkan deskripsi gambar di sini

Ny
sumber
Saya membutuhkan opsi ini untuk Pengontrol Tampilan saya yang lain, dan ternyata ketika saya membuat VC baru, perubahan itu terbawa. Terima kasih untuk ini!
David
Ya! Bekerja, justo atur di ContainerView dan berfungsi!
Felipe FMMobile
46

Komentar cepat lain ... bahkan di XCode 6.1, ada bug dengan ruang vertikal muncul di bagian atas UIScrollViews, UITextViewsdan UITableViews.

masukkan deskripsi gambar di sini

Terkadang, satu-satunya cara untuk memperbaiki masalah ini adalah masuk ke Storyboard dan seret kontrol masalah sehingga tidak lagi menjadi subview pertama pada halaman.

masukkan deskripsi gambar di sini

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

Mike Gledhill
sumber
1
Perhatikan bahwa bug ini, errrr, masalah juga terjadi di iOS 8 jika Anda memiliki UITextView sebagai sub-kontrol pertama di halaman Anda ... jadi itu bukan hanya masalah UITableView.
Mike Gledhill
1
Dari semua solusi hanya peretasan ini yang berhasil untuk saya. Perbaikan aneh untuk bug aneh. Saya telah menghadapi masalah ini dengan UITableview.
Mesbah
4
1 juta terima kasih! Ini adalah satu-satunya solusi yang berhasil untuk saya.
user139816
1
(Saya kagum pada 18 bulan kemudian, dan pembaca masih memilih jawaban ini. Apakah Apple belum memperbaiki masalah ini dengan serius?)
Mike Gledhill
1
menyelamatkan hidupku! Terima kasih. Tahukah Anda berapa lama untuk menemukan "perbaikan" sederhana ini? grrh
Mc.Stever
40

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.

self.automaticallyAdjustsScrollViewInsets = NO;

Ini akan melakukan triknya.

EDIT 1:

Juga, orang bisa mencoba -

self.navigationController.navigationBar.translucent = YES;

Ini juga menghilangkan bantalan ekstra di atas.

girish_vr
sumber
Jawaban yang sangat bagus, kecuali jika tidak tepat menjawab pertanyaan. Esilver berbicara tentang celah 35px, tetapi iOS7 menambahkan header 20px ekstra: sama dengan tinggi status bar.
Martin
Masalah yang konyol. Terima kasih atas jawabannya.
Genki
Ini adalah jawaban untuk masalah yang berbeda.
entonio
Terima kasih itu bekerja untuk saya, dalam kasus saya saya punya tableviewcontroller tertanam dalam viewcontroller, dan dengan menetapkan automaticallyAdjustsScrollViewInsets = false di viewcontroller kesenjangan atas menghilang
Alexey
39

Saat menggunakan TableView yang dikelompokkan, gunakan ini untuk menghindari pemotongan tepi di viewWillAppear

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
Aqib Mumtaz
sumber
Mencoba semua yang lain. Ini yang berhasil! Terima kasih
Michael
36

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:

  1. a UITableViewtidak suka memiliki header dengan ketinggian 0,0. Jika yang ingin Anda lakukan adalah memiliki tajuk dengan tinggi 0, Anda dapat melompat ke solusinya.

  2. bahkan jika nanti Anda menetapkan tinggi bukan 0,0 untuk header Anda, a UITableViewtidak 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:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

Sesuatu seperti ini akan menyebabkan masalah di beberapa titik (biasanya, setelah gulir):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
Aurelien Porte
sumber
Akhirnya, saya menemukan jawaban yang berhasil. Terima kasih. Selain itu, saya belajar bahwa tableView.tableHeaderViewsebenarnya adalah tampilan aksesori di atas konten baris. Saya bingung dengan header bagian sampai jawaban Anda keluar.
Joe Huang
1
CGFLOAT_MINtelah diganti dengan CGFloat.leastNormalMagnitudedi Swift 3
Clay Ellis
29

Storyboard:

Hapus centang: Adjust Scroll View Insetspada opsi View Controller's

masukkan deskripsi gambar di sini

Kode:

self.automaticallyAdjustsScrollViewInsets = false
Bartłomiej Semańczyk
sumber
2
menggunakan xcode 7 Saya tidak melihat Atribut inspektur> Layout, di mana saya harus menambahkan self.automaticallyAdjustsScrollViewInsets = false
alex
dalam pandangan memang memuat.
CW0007007
23

Ini adalah solusi untuk iOS 10 menggunakan Swift 3:

Anda dapat menyingkirkan bantalan atas dan bawah dengan menerapkan metode berikut dari menu UITableViewDelegate.

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

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}
AndreasLukas
sumber
Halaman kedua pada SO membantu saya .... Saya tidak tahu mengapa, mungkin karena AutomaticDimension, mungkin karena Kendala dengan VFL, bagaimanapun, terima kasih! ozi bua ist brav! : D
Pentarex
Ini adalah bagian header dan footer. Pertanyaannya berkaitan dengan seluruh header tabel. Juga, tidak ada yang spesifik untuk Swift3 atau iOS 10 dalam metode pendelegasian (mereka sudah ada sejak selamanya).
Nicolas Miari
14

Dalam kasus saya inilah yang membantu saya. Saya mendukung ios6 juga.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}
Lukas
sumber
Tidak yakin apa ini tetapi itu bekerja dengan sempurna. Bisakah Anda memberi penjelasan?
Matt Wolfe
@MattWolfe Saya tersesat, dan menemukan solusi ini, tidak yakin mengapa ini terjadi. Dugaan saya adalah bahwa controller memutuskan bahwa tableview memerlukan inset, karena status bar (atau dalam kasus lain toolbar / tabbar) sehingga secara otomatis menambahkannya. Saya benar-benar berjuang dengan beberapa "fitur" iOS7 baru. Mungkin seseorang memahaminya, dan memiliki penjelasan nyata tentang ini?
Lukas
Menghabiskan 2 hari terakhir porting aplikasi yang relatif kecil ke iOS 7 dan masih memiliki masalah kecil .. Saya memperbaikinya di ios 7 rusak dalam 6 dan sebaliknya .. Mengemudi saya gila!
Matt Wolfe
Ini adalah masalah yang berbeda dari OP. Bahkan dengan ini, untuk tampilan tabel yang dikelompokkan, ruang tambahan ditambahkan di bagian atas.
RajV
1
ini tampaknya menjadi baris kunci: self.automaticallyAdjustsScrollViewInsets = TIDAK; hanya pengaturan yang menghapus ruang ekstra yang saya miliki.
Mike M
14

Cukup tambahkan berikut ini ke viewDidLoad Anda di VC Anda:

self.automaticallyAdjustsScrollViewInsets = NO;
judepereira
sumber
Perbaikan ini berhasil dan saya lebih suka pengaturan inset secara manual menggunakan angka ajaib. Terima kasih!
imobilizer
14

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 tableViewHeaderdengan UIViewdengan setidaknya 0.01ketinggian berhasil. CGRectZerotidak membantu, tidak ada yang benar-benar membantu:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
sunshinejr
sumber
10

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:

 self.automaticallyAdjustsScrollViewInsets = false

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.

Vinod Joshi
sumber
10

Terima kasih atas jawabannya oleh @ Aurelien Porte. Ini solusinya

Penyebab masalah ini: -

  1. UITableView tidak suka memiliki header dengan tinggi 0,0. Jika yang ingin Anda lakukan adalah memiliki tajuk dengan tinggi 0, Anda dapat melompat ke solusinya.
  2. bahkan jika nanti Anda menetapkan tinggi tidak 0,0 untuk header Anda, sebuah UITableView tidak suka diberi header dengan tinggi 0,0 pada awalnya.

Di ViewDidLoad: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

Tidak Perlu Untuk Sesuatu Seperti Ini: -

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

Dalam heightForHeaderInSectiondelegasi: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

Dalam viewForHeaderInSectiondelegasi: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}
Pisey Ashish
sumber
10

Ini adalah cara memperbaiki dengan mudah di iOS 11 dan Xcode 9.1 melalui Storyboard:

Pilih Tampilan Tabel> Pemeriksa Ukuran> Isi Konten: Jangan

Saeed Ir
sumber
1
Bekerja untuk saya :)
bhupinder
Bagus! Terima kasih :)
Saeed Ir
1
Ini bukan automaticallyAdjustsScrollViewInsetsdi ios 11
Nik Kov
9

Saya berasumsi itu hanya bagian dari UITableViewStyleGroupedgaya 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 semua subviewsdariUITableView 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):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}
Kevin
sumber
3
Jika UITableViews (lebih spesifik UITableViewCellScrollView) di iOS7 telah mengajarkan kita satu hal, itu meninggalkan hirarki tampilan dibangun di kelas saja.
Matthias Bauch
Poin yang bagus. Opsi lainnya adalah ... untuk terus meretas untuk setiap iOS;)
Dan Rosenstark
Ups, ya. Dimaksudkan untuk menulis peringatan itu tetapi lupa.
Kevin
Kevin - saya pikir Anda benar, ini sesuai desain. Tampaknya mengembalikan 0 untuk heightForHeaderInSection adalah cara termudah untuk menghapus bantalan ini. Untuk beberapa alasan pada contoh khusus itu tidak berfungsi untuk saya, tetapi itu bekerja pada UITableViews lainnya.
esilver
1
Ini pasti "dengan desain". Jika Anda menjeda eksekusi dan berlari: 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.
Tn.
9

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

self.navigationController.navigationBar.translucent = YES;

framework akan secara otomatis mengatur contentInset yang sudah dihitung sebelumnya .


Untuk menghindarinya bisa Anda lakukan

self.automaticallyAdjustsScrollViewInsets = NO;

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

zvjerka24
sumber
penyelamat! terima kasihself.automaticallyAdjustsScrollViewInsets = false
ethanneff
8

Kode ini bekerja untuk saya, Jawaban terbaik bagi saya yang ditulis di objective-Catas sehingga saya mengubahnya menjadi Swift.

Untuk Swift 4.0+

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

Tulis saja ini viewDidLoad()dan itu akan bekerja seperti pesona.

Vipul Kumar
sumber
1
terima kasih banyak, bekerja dengan baik untukku.
Ângelo Polotto
1
selamat datang Anda coding
Vipul Kumar
7

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.

Oded
sumber
Berlari ke masalah yang sama, tidak dapat menyelesaikannya dengan mengubah contentInset tetapi metode ini berhasil, meskipun itu cukup rumit. Untuk apa nilainya, menggunakan alat debugging visual, saya bisa melihat bahwa sementara UITableView memiliki ketinggian yang tepat, UITableViewWrapper di dalamnya tidak.
Mic Fok
Sempurna. Ini memperbaiki bug untuk saya, di XCode 6.1. Tidak ada saran lain di halaman StackOverflow ini yang membuat perbedaan. Saya memiliki UITableView dalam UIView, dan itu adalah subview pertama. Menyeretnya untuk menjadi subview ke-2 memperbaikinya dengan sempurna. (Jika ada yang membutuhkan saya, saya akan berada di pub.)
Mike Gledhill
Terima kasih! Ini juga berfungsi jika Anda memiliki pengontrol tampilan tabel di dalam sebuah wadah. Memindahkan wadah sehingga bukan yang pertama dalam tampilan induk menghilangkan celah di bagian atas tampilan tabel.
strangeluck
7

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.

Jiangfan Du
sumber
1
Jika saya bisa, saya akan memperbaikinya lebih dari satu kali. Pasti ada kesalahan autolayout yang aneh atau semacamnya ... Seperti apa pun> 0 berfungsi, saya sarankan alih-alih menggunakan 0,1 FLT_EPSILON atau DBL_EPSILON, karena keduanya mewakili nilai positif terkecil sehingga 1,0 + epsilon! = 1,0
Henri Normak
7

Satu-satunya hal yang berhasil bagi saya adalah:

Cepat :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Tujuan-C :

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

Juga, saya masih punya ruang ekstra untuk bagian pertama. Itu karena saya salah menggunakan tableHeaderViewproperti. Memperbaikinya juga dengan menambahkan:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
Danut Pralea
sumber
Bekerja untuk saya untuk Swift 4.2. Terima kasih
Sylar
Mencoba segala sesuatu di halaman ini, untuk tampilan tabel iOS13 dikelompokkan dengan tampilan header. self.tableView.tableHeaderView = UIView (bingkai: CGRect (x: 0, y: 0, lebar: tableView.frame.size.width, tinggi: 0,01)). memperbaiki masalah ini.
Ning
7

Kode Swift 4: Untuk tampilan tabel tanpa header bagian, Anda dapat menambahkan kode ini:

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

dan Anda akan mendapatkan jarak tajuk ke 0.

Jika Anda ingin tajuk tinggi spesifik Anda lulus nilai itu:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

dan tampilan dari delegasi viewForHeaderinSection.

keerthana manoharan
sumber
Ini tidak menjawab pertanyaan. Pertanyaannya adalah tentang dari mana jarak ekstra itu berasal, bukan bagaimana cara menghilangkannya.
Stephen Newell
Yang aneh adalah bahwa jika Anda mengembalikan 0 di heightForHeaderInsection Anda masih mendapatkan ruang ekstra ini. Ia bekerja sempurna dengan CGFloat.leastNormalMagnitude (angka paling positif)
ShadeToD
7

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.

masukkan deskripsi gambar di sini

pengguna832
sumber
Apa informasi tambahan selain tangkapan layar dibandingkan dengan jawaban ini ?
Artjom B.
itu sama saya kira, saya tidak menemukan jawaban itu ketika saya mencari solusi. Haruskah saya menghapus jawaban saya kalau begitu ..?
user832
Tidak jika Anda dapat sedikit memperluas jawaban Anda dengan menjelaskan mengapa Content insets = Tidak pernah benar-benar menyelesaikan masalah ini (bagaimana cara kerja opsi ini?).
Artjom B.
Ketika inset konten diatur ke tidak pernah, tableView tidak akan menggulir ke atas pada editing TextField.
mojtaba al moussawi
6

gunakan yang ini saya pikir ini bantuan ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }
Shahzaib Maqbool
sumber
1
Cemerlang! Bekerja seperti pesona di iOS 9.2. Jawaban ini sangat cocok karena dalam beberapa kasus saya perlu menekan header pertama sementara yang lain menunjukkannya. Saya melihat jawaban lain menggunakan CGFloat.min, itu juga berfungsi. Jadi viewController saya sekarang dapat menyediakan bilangan real seperti 44.0 atau pada dasarnya 0.
David H
6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
AG
sumber
otomatisAdjustsScrollViewInsets = karya salah dari saya! Terima kasih!
Daniel Kuta