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,
ios
objective-c
iphone
cocoa-touch
uikit
Rumit
sumber
sumber
Jawaban:
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
cellForRowAtIndexPath
untuk 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)
sumber
Cara yang mungkin lebih mudah untuk mencapai ini:
Tujuan-C:
Cepat:
Header bagian sekarang akan bergulir seperti sel biasa.
sumber
(Untuk yang pernah tiba di sini karena gaya tabel yang salah) Ubah gaya Tabel dari biasa menjadi dikelompokkan, melalui inspektur atribut, atau melalui kode:
sumber
TableView Style
properti di AttributesInspector.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
UITableView
dan kembaliNO
dengan dua metode:sumber
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.
Terapkan UITableView dengan gaya UITableViewStylePlain.
Terapkan titleForHeaderInSection seperti biasa (Anda bisa mendapatkan nilai ini dengan menggunakan logika Anda sendiri, tetapi saya lebih suka menggunakan delegasi standar).
Nomor ImmobementOfSectionsInTableView seperti biasa
Terapkan numberOfRowsInSection seperti biasa.
Kembalikan 0.0f tingginyaForHeaderInSection.
JANGAN mengimplementasikan viewForHeaderInSection. Hapus metode sepenuhnya daripada mengembalikan nol.
Di ketinggianForRowAtIndexPath. Periksa apakah (indexpath.row == 0) dan kembalikan tinggi sel yang diinginkan untuk tajuk bagian, jika tidak kembalikan tinggi sel.
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.
Sekarang implementasikan willSelectRowAtIndexPath dan kembalikan nil jika indexpath.row == 0. Ini akan peduli bahwa didSelectRowAtIndexPath tidak pernah dipecat untuk baris header Bagian.
Dan akhirnya di didSelectRowAtIndexPath, periksa apakah (indexpath.row! = 0) dan lanjutkan.
Dengan ini Anda selesai. Sekarang Anda memiliki tajuk bagian yang bebas menggulir dan tidak mengambang.
sumber
Di Pembuat Antarmuka Anda klik pada masalah Anda Tampilan Tabel
Kemudian navigasikan ke Atribut Inspektur dan ubah Style Plain menjadi Dikelompokkan;) Mudah
sumber
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:
sumber
Ubah Gaya TableView Anda:
Sesuai dokumentasi apel untuk UITableView:
sumber
Ada cara rumit lainnya. Gagasan utamanya adalah menggandakan nomor bagian, dan yang pertama hanya menampilkan headerView sedangkan yang kedua menunjukkan sel yang sebenarnya.
Yang perlu dilakukan adalah mengimplementasikan delegasi headerInSection:
Pendekatan ini juga berdampak kecil pada sumber data Anda:
Dibandingkan dengan pendekatan lain, cara ini aman tanpa mengubah frame atau contentInsets dari tampilan tabel. Semoga ini bisa membantu.
sumber
Cara termudah untuk mendapatkan apa yang Anda inginkan adalah mengatur gaya tabel Anda sebagai
UITableViewStyleGrouped
, gaya pemisah sebagaiUITableViewCellSeparatorStyleNone
:Jangan coba kembali tampilan footer sebagai
nil
, jangan lupa mengatur tinggi header dan tampilan header, setelah Anda harus mendapatkan apa yang Anda inginkan.sumber
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.
sumber
Untuk Swift 3+
Cukup gunakan
UITableViewStyleGrouped
dan atur tinggi footer ke nol dengan yang berikut ini:sumber
.leastNormalMagnitude
. Anda juga perlu menerapkantableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
viewForFooterInSection
fungsi dalam kasus ini.0
dan.leastNormalMagnitude
memiliki efek yang sama.viewForFooterSection
Diperlukan penerapan metode ini. Anda harus mengembalikan nol. Ini ada di Swift 5.1 dengan Xcode 11.3.1.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!
sumber
Mungkin Anda bisa menggunakan
scrollViewDidScroll
pada tableView dan mengubahcontentInset
berdasarkan pada header yang terlihat saat ini.Tampaknya berfungsi untuk kasus penggunaan saya!
sumber
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.
sumber
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.
sumber
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.
sumber
Periksa jawaban bagaimana menerapkan header dengan StoryBoard: Table Header Views di StoryBoards
Juga perhatikan bahwa jika Anda tidak menerapkan
itu tidak akan mengambang yang persis apa yang Anda inginkan.
sumber
Untuk menghapus bagian tajuk bagian mengambang sepenuhnya, Anda dapat melakukan ini:
return nil
tidak bekerjaUntuk menonaktifkan mengambang tetapi masih menampilkan header bagian, Anda dapat memberikan tampilan kustom dengan perilaku sendiri.
sumber
Variasi pada solusi @ samvermette:
sumber
Cuplikan menampilkan tajuk lengket hanya untuk bagian pertama. Header bagian lainnya akan mengambang dengan sel.
sumber
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:
Tampilan tajuk kemudian akan menghilang saat pengguna menggulir. Saya tidak tahu mengapa ini bekerja seperti ini, tetapi tampaknya mencapai apa yang ingin Anda lakukan.
sumber
Mungkin Anda bisa membuat latar belakang tampilan tajuk transparan:
Atau terapkan secara global:
sumber
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.
Itu harus melakukan trik!
sumber
Menurut jawaban @ samvermette, saya telah mengimplementasikan kode di atas di Swift untuk memudahkan coders menggunakan swift.
sumber
ref: https://stackoverflow.com/a/26306212
let tableView = UITableView(frame: .zero, style: .grouped)
PLUSE
Ini membantu menggunakan ruang tajuk
sumber
Pembaruan Terbaru 2020
Diuji dengan Xcode 14.
Untuk menyembunyikan header bagian apa pun, Kembalikan nil untuk judul delegasi bagian
sumber
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
sumber