Saya memasukkan / menghapus sel tabel menggunakan insertRowsAtIndexPaths/deleteRowsAtIndexPaths
dibungkus beginUpdates/endUpdates
. Saya juga menggunakan beginUpdates/endUpdates
saat menyesuaikan rowHeight. Semua operasi ini dianimasikan secara default.
Bagaimana saya bisa mendeteksi bahwa animasi telah berakhir saat menggunakan beginUpdates/endUpdates
?
iphone
objective-c
ios
ipad
pixelfreak
sumber
sumber
-scrollToRowAtIndexPath:atScrollPosition:animated:
.Jawaban:
Bagaimana dengan ini?
Ini berfungsi karena animasi tableView menggunakan
CALayer
animasi secara internal. Artinya, mereka menambahkan animasi ke sembarang tempatCATransaction
. Jika tidakCATransaction
ada terbuka (kasus normal), maka satu secara implisit dimulai, yang diakhiri pada akhir runloop saat ini. Tetapi jika Anda memulainya sendiri, seperti yang dilakukan di sini, maka itu akan menggunakan yang itu.sumber
completionBlock
sebelumnyabeginUpdates
danendUpdates
suka di cuplikan?[CATransaction commit]
harus dipanggil setelah bukan sebelumnya[tableView endUpdates]
.Versi Swift
sumber
Jika Anda menargetkan iOS 11 dan yang lebih baru, Anda harus menggunakan
UITableView.performBatchUpdates(_:completion:)
:sumber
Solusi yang mungkin adalah mewarisi dari UITableView tempat Anda memanggil
endUpdates
dan menimpanyasetContentSizeMethod
, karena UITableView menyesuaikan ukuran kontennya agar cocok dengan baris yang ditambahkan atau dihapus. Pendekatan ini juga harus berhasilreloadData
.Untuk memastikan bahwa notifikasi dikirim hanya setelah
endUpdates
dipanggil, seseorang juga bisa menimpaendUpdates
dan menyetel bendera di sana.sumber
Anda dapat memasukkan operasi Anda dalam blok animasi UIView seperti ini:
Penghargaan untuk https://stackoverflow.com/a/12905114/634940 .
sumber
endUpdates
, tetapi sebelum animasi selesai.Belum menemukan solusi yang baik (singkatnya subclassing UITableView). Saya telah memutuskan untuk menggunakan
performSelector:withObject:afterDelay:
untuk saat ini. Tidak ideal, tetapi menyelesaikan pekerjaan.UPDATE : Sepertinya saya dapat menggunakan
scrollViewDidEndScrollingAnimation:
untuk tujuan ini (ini khusus untuk implementasi saya, lihat komentar).sumber
scrollViewDidEndScrollingAnimation
hanya dipanggil untuk menanggapisetContentOffset
danscrollRectToVisible
Anda bisa menggunakan
tableView:willDisplayCell:forRowAtIndexPath:
seperti:Tapi ini juga akan dipanggil saat sel yang sudah ada di tabel berpindah dari layar ke layar sehingga mungkin tidak persis seperti yang Anda cari. Saya hanya melihat melalui semua metode
UITableView
danUIScrollView
delegasi dan tampaknya tidak ada yang harus ditangani tepat setelah sel dimasukkan animasi.Mengapa tidak memanggil metode Anda ingin dipanggil ketika animasi berakhir setelah
endUpdates
?sumber
willDisplayCell
akan berhasil. Saya membutuhkannya terjadi setelah animasi karena saya perlu melakukan pembaruan visual hanya setelah semuanya beres.