Saya memiliki UITableView yang memiliki dua mode. Ketika kami beralih di antara mode, saya memiliki jumlah bagian dan sel yang berbeda per bagian. Idealnya, itu akan melakukan beberapa animasi keren ketika meja tumbuh atau menyusut.
Ini kode yang saya coba, tetapi tidak melakukan apa-apa:
CGContextRef context = UIGraphicsGetCurrentContext();
[UIView beginAnimations:nil context:context];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.5];
[self.tableView reloadData];
[UIView commitAnimations];
Adakah pemikiran tentang bagaimana saya bisa melakukan ini?
cocoa-touch
animation
Vertexwahn
sumber
sumber
_tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Fade)
Khususnya, itu hanya memperbarui Bagian 0, yang merupakan bagian pertama default.Anda mungkin ingin menggunakan:
Objektif-C
Cepat
Swift 3, 4 & 5
Tidak ada kerepotan. : D
Anda juga dapat menggunakan salah satu yang
UIViewAnimationOptionTransitions
Anda inginkan untuk efek dingin:transitionNone
transitionFlipFromLeft
transitionFlipFromRight
transitionCurlUp
transitionCurlDown
transitionCrossDissolve
transitionFlipFromTop
transitionFlipFromBottom
sumber
[_tableView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)] withRowAnimation:UITableViewRowAnimationFade];
Memiliki lebih banyak kebebasan menggunakan
CATransition
kelas.Itu tidak terbatas pada memudar, tetapi dapat melakukan gerakan juga ..
Sebagai contoh:
(jangan lupa impor
QuartzCore
)Ubah
type
agar sesuai dengan kebutuhan Anda, sepertikCATransitionFade
dll.Implementasi di Swift:
Referensi untuk transisi CAT
Swift 5:
sumber
layer
properti aUITableViewCell
.Saya yakin Anda bisa memperbarui struktur data Anda, lalu:
Juga, "withRowAnimation" bukan boolean, tetapi gaya animasi:
sumber
Semua jawaban ini mengasumsikan bahwa Anda menggunakan UITableView dengan hanya 1 bagian.
Untuk secara akurat menangani situasi di mana Anda memiliki lebih dari 1 bagian, gunakan:
(Catatan: Anda harus memastikan bahwa Anda memiliki lebih dari 0 bagian!)
Hal lain yang perlu diperhatikan adalah bahwa Anda mungkin mengalami NSInternalInconsistencyException jika Anda mencoba memperbarui sumber data Anda secara bersamaan dengan kode ini. Jika demikian, Anda dapat menggunakan logika yang serupa dengan ini:
sumber
Cara untuk mendekati ini adalah dengan memberitahu tableView untuk menghapus dan menambahkan baris dan bagian dengan
insertRowsAtIndexPaths:withRowAnimation:
,deleteRowsAtIndexPaths:withRowAnimation:
,insertSections:withRowAnimation:
DandeleteSections:withRowAnimation:
metode UITableView.
Saat Anda memanggil metode ini, tabel akan menggerakkan masuk / keluar item yang Anda minta, lalu memanggil reloadData dengan sendirinya sehingga Anda dapat memperbarui status setelah animasi ini. Bagian ini penting - jika Anda menghidupkan segala sesuatu tetapi tidak mengubah data yang dikembalikan oleh dataSource tabel, baris akan muncul lagi setelah animasi selesai.
Jadi, alur aplikasi Anda adalah:
[self setTableIsInSecondState:YES];
[myTable deleteSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:YES]];
Selama metode dataSource tabel Anda mengembalikan set bagian dan baris baru yang benar dengan memeriksa
[self tableIsInSecondState]
(atau apa pun), ini akan mencapai efek yang Anda cari.sumber
Saya tidak bisa mengomentari jawaban teratas, tetapi implementasi cepat adalah:
Anda dapat memasukkan sebanyak mungkin bagian yang ingin Anda perbarui dalam argumen pertama untuk reloadSections.
Animasi lain yang tersedia dari dokumen: https://developer.apple.com/reference/uikit/uitableviewrowanimation
fade Baris atau baris yang dimasukkan atau dihapus memudar ke dalam atau keluar dari tampilan tabel.
kanan Baris atau baris yang dimasukkan meluncur dari kanan; baris atau baris yang dihapus meluncur ke kanan.
kiri Baris atau baris yang dimasukkan meluncur dari kiri; baris atau baris yang dihapus geser ke kiri.
atas Baris atau baris yang dimasukkan meluncur dari atas; baris atau baris yang dihapus meluncur keluar ke atas.
bawah Baris atau baris yang dimasukkan meluncur dari bawah; baris atau baris yang dihapus meluncur keluar ke bawah.
huruf besar-kecil Baris yang dimasukkan atau dihapus menggunakan animasi default.
tengah tampilan tabel mencoba untuk menjaga sel-sel lama dan baru berpusat di ruang yang mereka tempati atau akan tempati. Tersedia di iPhone 3.2.
otomatis Tampilan tabel memilih gaya animasi yang sesuai untuk Anda. (Diperkenalkan di iOS 5.0.)
sumber
Versi Swift 4 untuk jawaban @dmarnel:
sumber
Implementasi Cepat:
sumber
Untuk Swift 4
sumber
Dalam kasus saya, saya ingin menambahkan 10 baris lagi ke tampilan tabel (untuk jenis fungsi "tampilkan lebih banyak hasil") dan saya melakukan yang berikut:
Dalam kebanyakan kasus, alih-alih "self.numberOfRows", Anda biasanya akan menggunakan jumlah array objek untuk tampilan tabel. Jadi untuk memastikan solusi ini bekerja dengan baik untuk Anda, "arrayOfIndexPaths" perlu array yang akurat dari jalur indeks dari baris yang dimasukkan. Jika baris ada untuk salah satu jalur indeks ini, kode mungkin macet, jadi Anda harus menggunakan metode "reloadRowsAtIndexPaths: withRowAnimation:" untuk indeks pathds tersebut untuk menghindari tabrakan
sumber
Jika Anda ingin menambahkan animasi kustom Anda sendiri ke sel UITableView, gunakan
untuk mendapatkan array sel yang terlihat. Kemudian tambahkan animasi khusus ke setiap sel.
Lihat intisari yang saya posting untuk animasi sel kustom yang halus. https://gist.github.com/floprr/1b7a58e4a18449d962bd
sumber
Animasi tanpa reloadData () di Swift dapat dilakukan seperti ini (pada versi 2.2):
jika Anda perlu memanggil reloadData () setelah animasi berakhir, Anda dapat merangkul perubahan dalam transaksi CAT seperti ini:
Logika ditampilkan untuk kasus ketika Anda menghapus baris, tetapi ide yang sama juga berfungsi untuk menambahkan baris. Anda juga dapat mengubah animasi menjadi UITableViewRowAnimation.Left untuk membuatnya rapi, atau pilih dari daftar animasi lain yang tersedia.
sumber
sumber
.3
dua kali?Untuk memuat ulang semua bagian , bukan hanya satu dengan durasi kustom .
duration
Parameter penggunaUIView.animate
untuk mengatur durasi kustom.sumber
UITableView
Animasi asli di SwiftSisipkan dan hapus baris sekaligus dengan
tableView.performBatchUpdates
begitu mereka terjadi secara bersamaan. Membangun jawaban dari @iKenndac menggunakan metode seperti:tableView.insertSections
tableView.insertRows
tableView.deleteSections
tableView.deleteRows
Ex:
Ini menyisipkan bagian di posisi nol dengan animasi yang dimuat dari atas. Ini akan menjalankan kembali
cellForRowAt
metode dan memeriksa sel baru di posisi itu. Anda bisa memuat ulang seluruh tampilan tabel dengan animasi tertentu.Re: pertanyaan OP, bendera bersyarat akan diperlukan untuk menunjukkan sel untuk keadaan tampilan tabel alternatif.
sumber