Apakah mungkin untuk menonaktifkan header mengambang di UITableView dengan UITableViewStylePlain?


177

Saya menggunakan UITableView'tata letak' konten konten. Saya menggunakan header dari tampilan tabel untuk menata gambar tertentu dll. Dan saya lebih suka jika mereka tidak mengambang tetapi tetap statis seperti yang mereka lakukan ketika gaya diatur ke UITableViewStyleGrouped.

Lainnya kemudian menggunakan UITableViewStyleGrouped, apakah ada cara untuk melakukan ini? Saya ingin menghindari penggunaan yang dikelompokkan karena menambah margin di semua sel saya dan mengharuskan penonaktifan tampilan latar belakang untuk masing-masing sel. Saya ingin kontrol penuh dari tata letak saya. Idealnya mereka akan menjadi "UITableViewStyleBareBones", tapi saya tidak melihat opsi itu di dokumen ...

Terimakasih banyak,



59
Gunakan gaya tabel UITableViewStyleGrouped - ini adalah jawaban untuk semua yang mencari menonaktifkan header mengambang dan tidak membaca seluruh pertanyaan (itu terjadi pada saya ...).
Rata

@Kasztan Ini adalah solusi garis nol yang bekerja sangat baik! Terima kasih.
Lee Fastenau

Jawaban:


27

Anda harus dapat memalsukan ini dengan menggunakan sel khusus untuk melakukan baris tajuk Anda. Ini kemudian akan bergulir seperti sel lain di tampilan tabel.

Anda hanya perlu menambahkan beberapa logika di Anda cellForRowAtIndexPathuntuk mengembalikan jenis sel yang tepat ketika itu adalah baris tajuk.

Anda mungkin harus mengelola bagian Anda sendiri, yaitu memiliki semuanya dalam satu bagian dan memalsukan header. (Anda juga dapat mencoba mengembalikan tampilan tersembunyi untuk tampilan tajuk, tetapi saya tidak tahu apakah itu akan berhasil)


11
Ya ... sepertinya sedikit retas. Ini seperti pengawasan bagian Apple, karena jelas ada kode untuk melakukannya, kita hanya perlu mengatur bendera.
Tricky

2
Periksa jawaban saya di bawah ini untuk cara yang benar untuk mencapai efek tanpa hack khusus, hanya mengelola sel pertama setiap bagian sebagai header bagiannya!
Sumit Anantwar

338

Cara yang mungkin lebih mudah untuk mencapai ini:

Tujuan-C:

CGFloat dummyViewHeight = 40;
UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, dummyViewHeight)];
self.tableView.tableHeaderView = dummyView;
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0);

Cepat:

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

Header bagian sekarang akan bergulir seperti sel biasa.


5
Sialan ini bekerja seperti pesona !! Kehadiran tajuk tampilan tajuk menghentikan tajuk bagian dari mengambang. Dan tajuk yang tidak terlihat dengan inset konten yang sesuai untuk tabel melakukan trik .. Terima kasih banyak! bertanya-tanya mengapa jawaban ini tidak mendapatkan banyak perhatian
Shyam Bhat

4
Masih tidak percaya! Tidak ada API pribadi, tidak menggali ke dalam kelas, tidak ada! Saya telah menghadapi masalah ini selama berabad-abad dan telah menambahkan tampilan tabel di atas tampilan gulir (dengan gulir tampilan tabel dinonaktifkan), yang akan membuat header tabel gulir secara normal. tetapi baru mulai mencari apakah apel memberikan metode baru belakangan ini untuk memperbaikinya .. sangat senang saya menemukan jawaban Anda. terima kasih lagi
Shyam Bhat

13
satu-satunya kelemahan yang saya lihat adalah bahwa tajuk atas tidak akan ditampilkan lagi (Anda dapat melihatnya hanya dengan menggulir ke atas). Setidaknya bagi saya itu tidak ditampilkan
Ruzard

5
Anda masih bisa menampilkan tableHeaderView dari tabel dengan meningkatkan ketinggiannya di atas, dengan angka yang sama dengan tinggi header bagian dan mengurangi inset konten dengan nomor yang sama.
Shyam Bhat

2
Saya berharap saya dapat memperbaiki ini lagi, saya cukup yakin ini setidaknya ketiga kalinya saya berakhir pada pertanyaan ini dan ini telah memecahkan masalah saya.
Ell Neal

252

(Untuk yang pernah tiba di sini karena gaya tabel yang salah) Ubah gaya Tabel dari biasa menjadi dikelompokkan, melalui inspektur atribut, atau melalui kode:

let tableView = UITableView(frame: .zero, style: .grouped)

3
Ini persis apa yang saya cari. Terima kasih!
ninjudd

4
"Lain daripada menggunakan UITableViewStyleGrouped, apakah ada cara untuk melakukan ini?"
Michael Peterson

27
Untung saya belajar untuk memeriksa semua jawaban sebelum menerapkan jawaban yang paling tervvatif :)
Tung Fam

1
Sekarang orang-orang ini, adalah jawaban yang Anda cari. Ketahuilah bahwa Anda juga dapat menemukan TableView Styleproperti di AttributesInspector.
Cristian Holdunu

4
Pertanyaannya secara spesifik menyebutkan untuk mencari cara "Lainnya kemudian menggunakan UITableViewStyleGrouped"
Ferdz

73

PERINGATAN : solusi ini mengimplementasikan metode API yang dipesan. Ini bisa mencegah aplikasi dari disetujui oleh Apple untuk distribusi di AppStore.

Saya telah menjelaskan metode pribadi yang mengubah tajuk bagian mengambang di blog saya

Pada dasarnya, Anda hanya perlu subkelas UITableViewdan kembali NOdengan dua metode:

- (BOOL)allowsHeaderViewsToFloat;
- (BOOL)allowsFooterViewsToFloat;

40
Jawaban tidak layak untuk downvote hanya karena referensi API pribadi (tidak semua orang menulis kode untuk diserahkan ke AppStore). Ini benar ganda ketika jawabannya benar. Subclassing (atau, lebih mudah, membuat kategori UITableView) yang mengembalikan TIDAK untuk metode ini menghentikan header dari mengambang. Jika Anda ingin melihat ini ditambahkan sebagai API publik, silakan ajukan laporan bug: bugreport.apple.com
jemmons

5
Jika kami menerapkan fungsi itu di App, bagaimana Apple menyadari Anda menggunakan API pribadi? Dari yang mereka tahu, saya baru saja mengimplementasikan metode dalam subclass dari UITableView, dan mereka bahkan tidak bisa melihatnya tanpa melakukan de-assembling kodenya, dan itu tidak akan mudah. Itu bukan MEMANGGIL metode dalam API pribadi, itu hanya menerapkan satu ....
Javier Soto

3
@jemmons jika Anda tidak ingin saya menurunkan tanda jawaban sebagai "API pribadi digunakan di sini". Semacam penafian :)
kas-kad

2
Tautan "blog saya" Anda rusak
MartinMoizard

12
@jemmons "tidak semua orang menulis kode untuk diserahkan ke AppStore" Appstore sebenarnya bukan masalah. Masalahnya adalah apel dapat mengubah API pribadi tanpa berkomunikasi atau mencela yang akan merusak aplikasi Anda. Itu alasan yang lebih baik mengapa Anda tidak harus menggunakan API pribadi daripada ditolak oleh Apple
aryaxt

29

Ok, saya tahu ini sudah terlambat tetapi saya harus melakukannya. Saya telah menghabiskan 10 jam dengan sekarang mencari solusi yang berfungsi tetapi tidak menemukan jawaban yang lengkap. Memang menemukan beberapa petunjuk tetapi sulit bagi pemula untuk memahaminya. Jadi saya harus memasukkan 2 sen dan menyelesaikan jawabannya.

Seperti yang telah disarankan dalam beberapa jawaban, satu-satunya solusi yang dapat saya terapkan adalah dengan memasukkan sel normal dalam tampilan tabel dan menanganinya sebagai Header Bagian, tetapi cara yang lebih baik untuk mencapainya adalah dengan memasukkan sel-sel ini di baris 0 dari setiap bagian. Dengan cara ini kita dapat menangani tajuk non-apung khusus ini dengan sangat mudah.

Jadi, langkah-langkahnya adalah.

  1. Terapkan UITableView dengan gaya UITableViewStylePlain.

    -(void) loadView
    {
        [super loadView];
    
        UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
        tblView.delegate=self;
        tblView.dataSource=self;
        tblView.tag=2;
        tblView.backgroundColor=[UIColor clearColor];
        tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
  2. Terapkan titleForHeaderInSection seperti biasa (Anda bisa mendapatkan nilai ini dengan menggunakan logika Anda sendiri, tetapi saya lebih suka menggunakan delegasi standar).

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        NSString *headerTitle = [sectionArray objectAtIndex:section];
        return headerTitle;
    }
  3. Nomor ImmobementOfSectionsInTableView seperti biasa

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    {
        int sectionCount = [sectionArray count];
        return sectionCount;
    }
  4. Terapkan numberOfRowsInSection seperti biasa.

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    {
        int rowCount = [[cellArray objectAtIndex:section] count];
        return rowCount +1; //+1 for the extra row which we will fake for the Section Header
    }
  5. Kembalikan 0.0f tingginyaForHeaderInSection.

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 0.0f;
    }
  6. JANGAN mengimplementasikan viewForHeaderInSection. Hapus metode sepenuhnya daripada mengembalikan nol.

  7. Di ketinggianForRowAtIndexPath. Periksa apakah (indexpath.row == 0) dan kembalikan tinggi sel yang diinginkan untuk tajuk bagian, jika tidak kembalikan tinggi sel.

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row == 0)
        {
            return 80; //Height for the section header
        }
        else
        {
            return 70; //Height for the normal cell
        }
    }
  8. Sekarang di cellForRowAtIndexPath, periksa apakah (indexpath.row == 0) dan implementasikan sel seperti yang Anda inginkan menjadi header bagian dan atur gaya pemilihan ke none. ELSE mengimplementasikan sel seperti yang Anda inginkan sel normal.

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
            if (cell == nil)
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
    
                cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
            }
    
            cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
    
            return cell;
        }
        else
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    
            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
    
                cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
                cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
            }
    
            cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
    
            return cell;
        }
    }
  9. Sekarang implementasikan willSelectRowAtIndexPath dan kembalikan nil jika indexpath.row == 0. Ini akan peduli bahwa didSelectRowAtIndexPath tidak pernah dipecat untuk baris header Bagian.

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return nil;
        }
    
        return indexPath;
    }
  10. Dan akhirnya di didSelectRowAtIndexPath, periksa apakah (indexpath.row! = 0) dan lanjutkan.

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row != 0)
        {
            int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
    
            //Do what ever you want the selection to perform
        }
    }

Dengan ini Anda selesai. Sekarang Anda memiliki tajuk bagian yang bebas menggulir dan tidak mengambang.


1
Diimplementasikan 'willSelectRowAtIndexPath' sehingga kontrol tidak pernah mencapai 'didSelectRowAtIndexPath' dalam memilih baris Section Header.
Sumit Anantwar

Sebenarnya, saya melipat + membuka baris ketika header dipilih. Tapi senang mengetahui Anda bisa melakukan itu
Yariv Nissim

Jawaban bagus, tetapi mengapa 'jika (indexPath.row! = 0)' check in 'didSelectRowAtIndexPath'? Apakah hanya untuk menjadi lebih aman? Baris tidak pernah bisa 0 dengan implementasi 'willSelectRowAtIndexPath' Anda, bukan?
Glenn85

1
@ Glenn85, Maaf atas jawaban yang terlambat. Ya itu hanya untuk keamanan ekstra.
Sumit Anantwar

28

Di Pembuat Antarmuka Anda klik pada masalah Anda Tampilan Tabel

tampilan tabel masalah

Kemudian navigasikan ke Atribut Inspektur dan ubah Style Plain menjadi Dikelompokkan;) Mudah

mudah


17

Hal yang menarik tentang UITableViewStyleGrouped adalah bahwa tableView menambahkan gaya ke sel dan bukan ke TableView.

Gaya ditambahkan sebagai backgroundView ke sel sebagai kelas yang disebut UIGroupTableViewCellBackground yang menangani menggambar latar belakang yang berbeda sesuai dengan posisi sel di bagian tersebut.

Jadi solusi yang sangat sederhana adalah dengan menggunakan UITableViewStyleGrouped, atur backgroundColor tabel menjadi clearColor, dan cukup ganti backgroundView sel di cellForRow:

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];

1
Ini harus menjadi jawaban teratas. Ada posting blog tentang hal itu di sini: corecocoa.wordpress.com/2011/09/17/…
Sam

Solusi ini tidak benar-benar berfungsi. Saya terus mendapatkan ruang ekstra di sekitar sel. Ada ide ?
gsempe

2
Bukankah contentView dari sel masih bergeser ke kanan?
Piotr Tomasik

15

Ubah Gaya TableView Anda:

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

Sesuai dokumentasi apel untuk UITableView:

UITableViewStylePlain- Tampilan tabel biasa. Setiap header atau footer bagian ditampilkan sebagai pemisah inline dan mengapung ketika tampilan tabel digulir.

UITableViewStyleGrouped- Tampilan tabel yang bagian-bagiannya menampilkan kelompok baris yang berbeda. Header dan footer bagian tidak mengapung.


5

Ada cara rumit lainnya. Gagasan utamanya adalah menggandakan nomor bagian, dan yang pertama hanya menampilkan headerView sedangkan yang kedua menunjukkan sel yang sebenarnya.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return sectionCount * 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }
    return _rowCount;
}

Yang perlu dilakukan adalah mengimplementasikan delegasi headerInSection:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerview;
    }
    return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerheight;
    }
    return 0;
}

Pendekatan ini juga berdampak kecil pada sumber data Anda:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int real_section = (int)indexPath.section / 2;
    //your code
}

Dibandingkan dengan pendekatan lain, cara ini aman tanpa mengubah frame atau contentInsets dari tampilan tabel. Semoga ini bisa membantu.


5

Cara termudah untuk mendapatkan apa yang Anda inginkan adalah mengatur gaya tabel Anda sebagai UITableViewStyleGrouped, gaya pemisah sebagai UITableViewCellSeparatorStyleNone:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN; // return 0.01f; would work same 
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

Jangan coba kembali tampilan footer sebagai nil, jangan lupa mengatur tinggi header dan tampilan header, setelah Anda harus mendapatkan apa yang Anda inginkan.


4

Meskipun ini mungkin tidak menyelesaikan masalah Anda, itu terjadi pada saya ketika saya ingin melakukan hal serupa. Alih-alih mengatur header saya menggunakan footer dari bagian di atas. Apa yang menyelamatkan saya adalah bahwa bagian ini kecil dan statis, sehingga tidak pernah digulir di bawah tampilan.


Ide yang hebat. Saya suka hack ini.
Steve Moser

agak lucu. menghargai ide itu, tetapi peretasan adalah peretasan. header akan mulai mengambang di bagian bawah sehingga tidak benar-benar menyelesaikan masalah
Shyam Bhat

4

Untuk Swift 3+

Cukup gunakan UITableViewStyleGroupeddan atur tinggi footer ke nol dengan yang berikut ini:

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

1
Anda dapat mengembalikan 0 sebagai ganti .leastNormalMagnitude. Anda juga perlu menerapkantableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
Ilias Karim

@IliasKarim Mengaturnya ke 0 mengharuskannya memiliki tinggi non-nol. Juga, itu tidak perlu untuk mengimplementasikan viewForFooterInSectionfungsi dalam kasus ini.
Tamás Sengel

0dan .leastNormalMagnitudememiliki efek yang sama. viewForFooterSectionDiperlukan penerapan metode ini. Anda harus mengembalikan nol. Ini ada di Swift 5.1 dengan Xcode 11.3.1.
Ilias Karim

3

Sambil memikirkan cara mendekati masalah ini, saya ingat detail yang sangat penting tentang UITableViewStyleGrouped. Cara UITableView mengimplementasikan gaya yang dikelompokkan (batas bulat di sekitar sel) adalah dengan menambahkan custom backgroundView ke UITableViewCells, dan bukan ke UITableView. Setiap sel ditambahkan backgroundView sesuai dengan posisinya di bagian (baris atas mendapatkan bagian atas dari batas bagian, yang tengah mendapatkan perbatasan sisi dan yang bawah mendapat - well, bagian bawah). Jadi, jika kita hanya ingin gaya polos, dan kita tidak memiliki custom backgroundView untuk sel kita (yang merupakan kasus di 90% dari waktu), maka semua yang perlu kita lakukan adalah menggunakan UITableViewStyleGrouped, dan menghapus latar belakang kustom . Ini dapat dilakukan dengan mengikuti dua langkah berikut:

Ubah gaya tableView kami menjadi UITableViewStyleGrouped Tambahkan baris berikut ke cellForRow, tepat sebelum kami mengembalikan sel:

cell.backgroundView = [[[Alokasi UIVi] initWithFrame: cell.bounds] autorelease];

Dan itu saja. Gaya tableView akan menjadi persis seperti UITableViewStylePlain, kecuali header mengambang.

Semoga ini membantu!


2

Mungkin Anda bisa menggunakan scrollViewDidScrollpada tableView dan mengubah contentInsetberdasarkan pada header yang terlihat saat ini.

Tampaknya berfungsi untuk kasus penggunaan saya!

extension ViewController : UIScrollViewDelegate{

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard   let tableView = scrollView as? UITableView,
            let visible = tableView.indexPathsForVisibleRows,
            let first = visible.first else {
            return
        }

        let headerHeight = tableView.rectForHeader(inSection: first.section).size.height
        let offset =  max(min(0, -tableView.contentOffset.y), -headerHeight)
        self.tableView.contentInset = UIEdgeInsetsMake(offset, 0, -offset, 0)
   }
}

1

Cara lain untuk melakukannya adalah dengan membuat bagian kosong tepat sebelum yang Anda inginkan header dan meletakkan header Anda di bagian itu. Karena bagian ini kosong, tajuk akan segera bergulir.


1

Anda dapat menambahkan satu Bagian (dengan nol baris) di atas, kemudian mengatur sectionFooterView di atas sebagai headerView bagian saat ini, footerView tidak mengambang. Semoga ini bisa membantu.


FooterViews mengapung, seperti HeaderViews. Mereka hanya mengapung di bagian bawah layar, bukan di atas.
Mark A. Donohoe

0

Abaikan XAK. Jangan menjelajahi metode pribadi apa pun jika Anda ingin aplikasi Anda mendapat peluang diterima oleh apel.

Ini paling mudah jika Anda menggunakan Interface Builder. Anda akan menambahkan UIView di bagian atas tampilan (ke mana gambar akan pergi), lalu tambahkan tampilan tabel Anda di bawah itu. IB harus mengukurnya sesuai; yaitu, bagian atas tampilan tabel menyentuh bagian bawah UIView yang baru saja Anda tambahkan dan tingginya mencakup seluruh layar.

Pemikiran di sini adalah bahwa jika UIView itu sebenarnya bukan bagian dari tampilan tabel, itu tidak akan menggulir dengan tampilan tabel. yaitu mengabaikan header tableview.

Jika Anda tidak menggunakan pembangun antarmuka, ini sedikit lebih rumit karena Anda harus mendapatkan posisi dan ketinggian yang benar untuk tampilan tabel.


Ini tidak menjawab pertanyaan. Tricky mengacu pada titleHeaderViews yang merupakan pandangan yang berada di antara sel, bukan tampilan header tabel yang sepertinya Anda sarankan.
Daniel Wood


0

Untuk menghapus bagian tajuk bagian mengambang sepenuhnya, Anda dapat melakukan ini:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] init];
}

return nil tidak bekerja

Untuk menonaktifkan mengambang tetapi masih menampilkan header bagian, Anda dapat memberikan tampilan kustom dengan perilaku sendiri.


0

Variasi pada solusi @ samvermette:

/// Allows for disabling scrolling headers in plain-styled tableviews
extension UITableView {

    static let shouldScrollSectionHeadersDummyViewHeight = CGFloat(40)

    var shouldScrollSectionHeaders: Bool {
        set {
            if newValue {
                tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: bounds.size.width, height: UITableView.shouldScrollSectionHeadersDummyViewHeight))
                contentInset = UIEdgeInsets(top: -UITableView.shouldScrollSectionHeadersDummyViewHeight, left: 0, bottom: 0, right: 0)
            } else {
                tableHeaderView = nil
                contentInset = .zero
            }
        }

        get {
            return tableHeaderView != nil && contentInset.top == UITableView.shouldScrollSectionHeadersDummyViewHeight
        }
    }

}

0

Cuplikan menampilkan tajuk lengket hanya untuk bagian pertama. Header bagian lainnya akan mengambang dengan sel.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    if section == 1 {
        tableView.contentInset = .zero
    }

}

func tableView(_ tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
    if section == 0 {
        tableView.contentInset = .init(top: -tableView.sectionHeaderHeight, left: 0, bottom: 0, right: 0)
    }
}

-1

Ini dapat dicapai dengan menetapkan tampilan header secara manual dalam metode viewDidLoad UITableViewController alih-alih menggunakan viewForHeaderInSection dari delegasi dan heightForHeaderInSection. Misalnya dalam subkelas UITableViewController Anda, Anda dapat melakukan sesuatu seperti ini:

- (void)viewDidLoad {
    [super viewDidLoad];

    UILabel *headerView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 40)];
    [headerView setBackgroundColor:[UIColor magentaColor]];
    [headerView setTextAlignment:NSTextAlignmentCenter];
    [headerView setText:@"Hello World"];
    [[self tableView] setTableHeaderView:headerView];
}

Tampilan tajuk kemudian akan menghilang saat pengguna menggulir. Saya tidak tahu mengapa ini bekerja seperti ini, tetapi tampaknya mencapai apa yang ingin Anda lakukan.


Ini bukan untuk bagian, ini untuk 1 header di bagian atas.
makdad

-1

Mungkin Anda bisa membuat latar belakang tampilan tajuk transparan:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    view.tintColor = [UIColor clearColor];
}

Atau terapkan secara global:

    [UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];

-2

Saya punya solusi lain yang lebih sederhana, untuk digunakan tanpa autolayout dan dengan semua yang dilakukan melalui XIB:

1 / Letakkan tajuk Anda di tampilan tabel dengan menyeret dan menjatuhkannya langsung di tampilan tabel.

2 / Di Inspektur Ukuran header yang baru dibuat, cukup ubah autosizing-nya: Anda hanya harus meninggalkan jangkar atas, kiri dan kanan, ditambah isian secara horizontal.

Begitulah seharusnya diatur untuk header

Itu harus melakukan trik!


-2

Menurut jawaban @ samvermette, saya telah mengimplementasikan kode di atas di Swift untuk memudahkan coders menggunakan swift.

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

-2

ref: https://stackoverflow.com/a/26306212

let tableView = UITableView(frame: .zero, style: .grouped)

PLUSE

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return 40
    }else{
        tableView.sectionHeaderHeight = 0
    }

    return 0
}

Ini membantu menggunakan ruang tajuk


Tolong, jangan lakukan itu—
MQoder

-3

Pembaruan Terbaru 2020

Diuji dengan Xcode 14.

Untuk menyembunyikan header bagian apa pun, Kembalikan nil untuk judul delegasi bagian

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}

-4

Anda dapat dengan mudah mencapai ini dengan menerapkan metode viewForHeaderInSection di kelas delegasi tampilan tabel. metode ini mengharapkan UIView sebagai objek kembali (yang merupakan tampilan header Anda). Saya telah melakukan hal yang sama dalam kode saya


Poster asli tidak menginginkan tajuk khusus. Mereka menginginkan tajuk yang tidak "mengambang" di bagian atas tabel. Saran Anda masih mengambang.
jemmons

ubah tampilan tabel ke UITableViewStyleGrouped dengan viewforheader, maka itu akan membuatnya berhenti
mskw
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.