Saya menemukan solusi SANGAT SEDERHANA untuk ini sebagai efek samping untuk UITableView
saya sedang mengerjakan .....
Menyimpan tinggi sel dalam variabel yang melaporkan tinggi asli secara normal melalui tableView: heightForRowAtIndexPath:
, lalu ketika Anda ingin menghidupkan perubahan tinggi, cukup ubah nilai variabel dan panggil ini ...
[tableView beginUpdates];
[tableView endUpdates];
Anda akan menemukan itu tidak melakukan isi ulang penuh tetapi cukup bagi UITableView
untuk tahu itu harus menggambar ulang sel, meraih nilai tinggi baru untuk sel .... dan coba tebak? Ini menganimasikan perubahan untuk Anda. Manis.
Saya memiliki penjelasan yang lebih terperinci dan contoh kode lengkap di blog saya ... Animate UITableView, Perubahan Tinggi Sel
You can also use this method followed by the endUpdates method to animate the change in the row heights without reloading the cell.
developer.apple.com/library/ios/documentation/UIKit/Reference/…Saya suka jawabannya oleh Simon Lee. Saya sebenarnya tidak mencoba metode itu tetapi sepertinya itu akan mengubah ukuran semua sel dalam daftar. Saya berharap untuk perubahan sel yang disadap. Saya agak melakukannya seperti Simon tetapi dengan sedikit perbedaan. Ini akan mengubah tampilan sel ketika dipilih. Dan itu memang bernyawa. Hanya cara lain untuk melakukannya.
Buat int untuk menyimpan nilai untuk indeks sel yang dipilih saat ini:
Kemudian:
Kemudian:
Saya yakin Anda dapat membuat perubahan serupa di tableView: cellForRowAtIndexPath: untuk mengubah jenis sel atau bahkan memuat file xib untuk sel.
Seperti ini, pemilihan saat ini akan mulai dari 0. Anda perlu melakukan penyesuaian jika Anda tidak ingin sel pertama dari daftar (pada indeks 0) terlihat dipilih secara default.
sumber
Tambahkan properti untuk melacak sel yang dipilih
Setel ke nilai sentinel di (misalnya)
viewDidLoad
, untuk memastikan bahwaUITableView
dimulai pada posisi 'normal'Di
heightForRowAtIndexPath
Anda dapat mengatur ketinggian yang Anda inginkan untuk sel yang dipilihDi
didSelectRowAtIndexPath
Anda menyimpan pilihan saat ini dan menyimpan ketinggian dinamis, jika diperlukanDalam
didDeselectRowAtIndexPath
mengatur indeks seleksi kembali ke nilai sentinel dan menghidupkan sel kembali ke bentuk normalsumber
reloadData tidak bagus karena tidak ada animasi ...
Inilah yang saya coba saat ini:
Hampir berfungsi dengan benar. Hampir. Saya meningkatkan ketinggian sel, dan kadang-kadang ada sedikit "cegukan" pada tampilan tabel saat sel diganti, seolah-olah beberapa posisi bergulir dalam tampilan tabel dipertahankan, sel baru (yang merupakan sel pertama di tabel) berakhir dengan offset-nya terlalu tinggi, dan scrollview memantul untuk memposisikannya kembali.
sumber
Saya tidak tahu apa semua hal ini tentang memanggil beginUpdates / endUpdates berturut-turut adalah, Anda bisa menggunakannya
-[UITableView reloadRowsAtIndexPaths:withAnimation:]
. Ini adalah contoh proyek .sumber
Saya memutuskan dengan
reloadRowsAtIndexPaths
.Saya menyimpan di
didSelectRowAtIndexPath
indexPath sel yang dipilih dan meneleponreloadRowsAtIndexPaths
di akhir (Anda dapat mengirim NSMutableArray untuk daftar elemen yang ingin Anda muat ulang).Di
heightForRowAtIndexPath
Anda dapat memeriksa apakah indexPath ada dalam daftar atau tidak dari selIndexPath dan kirim tinggi.Anda dapat memeriksa contoh dasar ini: https://github.com/ferminhg/iOS-Examples/tree/master/iOS-UITableView-Cell-Height-Change/celdascambiadetam Ini adalah solusi sederhana.
saya menambahkan semacam kode jika membantu Anda
sumber
Alih-alih
beginUpdates()
/endUpdates()
, panggilan yang disarankan adalah sekarang:Apple mengatakan, mengenai beginUpdates / endUpdates: "Gunakan metode performBatchUpdates (_: completion :) alih-alih yang ini bila memungkinkan."
Lihat: https://developer.apple.com/documentation/uikit/uitableview/1614908-beginupdates
sumber
Coba ini untuk meluaskan baris berurutan:
sumber
sumber
hanya sebuah catatan untuk seseorang seperti saya yang mencari tambah "Detail Selengkapnya" di sel khusus.
Melakukan pekerjaan yang sangat baik, tetapi jangan lupa untuk "memotong" tampilan sel. Dari Interface Builder pilih Cell Anda -> Content View -> dari Property Inspector pilih " Clip subview "
sumber
Inilah versi yang lebih pendek dari jawaban Simons untuk Swift 3. Juga memungkinkan untuk beralih pilihan sel
sumber
Swift 4 dan Di Atas
tambahkan kode di bawah ini ke dalam metode delegasi baris didelect tableview Anda
sumber
Versi Swift dari jawaban Simon Lee.
Kemudian di didSelectRowAtIndexPath ()
sumber
Iya itu mungkin.
UITableView
memiliki metode delegasididSelectRowAtIndexPath
Tetapi dalam kasus Anda jika pengguna menggulir dan memilih sel yang berbeda maka Anda harus memiliki sel yang dipilih terakhir untuk mengecilkan dan memperluas
reloadRowsAtIndexPaths:
panggilan sel yang saat ini dipilihheightForRowAtIndexPath:
sehingga menangani sesuai.sumber
Berikut ini adalah kode
UITableView
subkelas kustom saya , yang diperluasUITextView
di sel tabel, tanpa memuat ulang (dan kehilangan fokus keyboard):sumber
Saya menggunakan jawaban luar biasa @ Joy, dan bekerja dengan baik dengan ios 8.4 dan XCode 7.1.1.
Jika Anda ingin membuat sel Anda dapat diaktifkan, saya mengubah -tableViewDidSelect ke berikut ini:
Saya harap semua ini membantu Anda.
sumber
Periksa metode ini setelah iOS 7 dan yang lebih baru.
Perbaikan telah dilakukan untuk ini di iOS 8. Kita dapat mengaturnya sebagai properti dari tampilan tabel itu sendiri.
sumber
Versi cepat dari jawaban Simon Lee :
Ingatlah bahwa Anda harus memodifikasi properti ketinggian SEBELUM
endUpdates()
.sumber
Input -
tableView.beginUpdates () tableView.endUpdates () fungsi-fungsi ini tidak akan memanggil
func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}
Tetapi, jika Anda melakukannya, tableView.reloadRows (at: [selectedIndexPath! As IndexPath], dengan: .none)
Ini akan memanggil func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {} fungsi ini.
sumber
Saya baru saja menyelesaikan masalah ini dengan sedikit retasan:
Ketika saya perlu memperluas tinggi sel saya mengatur
isInEdit = YES
dan memanggil metode[self onTimer]
dan menjiwai pertumbuhan sel sampai mencapai nilai s_CellHeightEditing :-)sumber
Dapatkan jalur indeks dari baris yang dipilih. Muat ulang tabel. Dalam metode heightForRowAtIndexPath dari UITableViewDelegate, atur ketinggian baris yang dipilih ke ketinggian berbeda dan untuk yang lain mengembalikan tinggi baris normal
sumber
[table reloadData]
hasil dalam perubahan ketinggian terjadi secara instan, daripada menjiwai.