Cara membuat tombol "lebih" ketika pengguna menggesek sel dalam tampilan tabel (seperti aplikasi email di ios 7)
Saya telah mencari informasi ini baik di sini maupun di forum Cocoa Touch, tetapi sepertinya saya tidak dapat menemukan jawabannya dan saya berharap seseorang yang lebih pintar daripada saya dapat memberi saya solusi.
Saya ingin bahwa ketika pengguna menggesek sel tampilan tabel, untuk menampilkan lebih dari satu tombol pengeditan (dia default adalah tombol hapus). Di aplikasi Mail untuk iOS 7 Anda dapat menggesek untuk menghapus, tetapi ada tombol "LEBIH" yang muncul.
ios
uitableview
user-interface
cocoa-touch
swipe-gesture
Guy Kahlon
sumber
sumber
Jawaban:
Cara Melaksanakan
Sepertinya iOS 8 membuka API ini. Petunjuk tentang fungsi tersebut ada dalam Beta 2.
Untuk membuat sesuatu berfungsi, terapkan dua metode berikut pada delegasi UITableView Anda untuk mendapatkan efek yang diinginkan (lihat intisari contohnya).
Masalah Dikenal
Dokumentasi mengatakan tableView: commitEditingStyle: forRowAtIndexPath adalah:
Namun, menggesekkan tidak akan berhasil tanpanya. Bahkan jika metode rintisan kosong, masih membutuhkannya, untuk saat ini. Ini jelas merupakan bug dalam versi beta 2.
Sumber
https://twitter.com/marksands/status/481642991745265664 https://gist.github.com/marksands/76558707f583dbb8f870
Jawaban Asli: https://stackoverflow.com/a/24540538/870028
Memperbarui:
Contoh kode dengan ini berfungsi (Dalam Swift): http://dropbox.com/s/0fvxosft2mq2v5m/DeleteRowExampleSwift.zip
Kode sampel berisi metode yang mudah diikuti di MasterViewController.swift, dan hanya dengan metode ini Anda mendapatkan perilaku yang ditunjukkan dalam tangkapan layar OP:
sumber
tableView.editing = false
(NO
dalam objc) dan sel akan "menutup".Saya telah membuat perpustakaan baru untuk menerapkan tombol swippable yang mendukung berbagai transisi dan tombol yang dapat diperluas seperti aplikasi email iOS 8.
https://github.com/MortimerGoro/MGSwipeTableCell
Pustaka ini kompatibel dengan semua cara berbeda untuk membuat UITableViewCell dan diuji pada iOS 5, iOS 6, iOS 7 dan iOS 8.
Berikut contoh beberapa transisi:
Transisi perbatasan:
Transisi klip
Transisi 3D:
sumber
Jawaban Johnny adalah jawaban yang tepat. Saya hanya menambahkan ini di bawah di objektif-c untuk membuatnya lebih jelas untuk pemula (dan kita yang menolak untuk belajar sintaks Swift :)
Pastikan Anda mendeklarasikan delegasi uitableview dan memiliki metode berikut:
sumber
Ini (agak konyol) API pribadi.
Dua metode berikut ini bersifat pribadi dan dikirim ke delegasi UITableView:
Mereka cukup jelas.
sumber
Untuk meningkatkan jawaban Johnny, ini sekarang dapat dilakukan dengan menggunakan API publik sebagai berikut:
sumber
Saya harap Anda tidak bisa menunggu sampai apel memberi Anda apa yang Anda butuhkan, kan? Jadi inilah pilihan saya.
Buat sel khusus. Memiliki dua uiviews di dalamnya
Pada tampilan yang lebih rendah, tambahkan tombol apa saja yang Anda butuhkan. Atasi tindakannya sama seperti IBActions lainnya. Anda dapat menentukan waktu animasi, gaya dan apa pun.
sekarang tambahkan uiswipegesture ke tampilan atas dan ungkapkan tampilan bawah Anda pada gerakan swipe. Saya telah melakukan ini sebelumnya dan ini pilihan paling sederhana sejauh yang saya ketahui.
Semoga bantuan itu.
sumber
Ini tidak mungkin menggunakan SDK standar. Namun ada berbagai solusi pihak ketiga yang sedikit banyak meniru perilaku di Mail.app. Beberapa dari mereka (mis. MCSwipeTableViewCell , DAContextMenuTableViewController , RMSwipeTableViewCell ) mendeteksi gesekan menggunakan pengenal isyarat, beberapa dari mereka (misalnya SWTableViewCell ) meletakkan UISScrollView kedua di bawah standar
UITableViewCellScrollView
(subview pribadi dariUITableViewCell
) dan beberapa dari mereka memodifikasi perilaku dariUITableViewCellScrollView
.Saya paling suka pendekatan terakhir karena penanganan sentuhan terasa paling alami. Secara khusus, MSCMoreOptionTableViewCell baik. Pilihan Anda dapat bervariasi tergantung pada kebutuhan spesifik Anda (apakah Anda memerlukan panci dari kiri ke kanan juga, apakah Anda memerlukan kompatibilitas iOS 6, dll.). Perlu diketahui juga bahwa sebagian besar pendekatan ini membawa beban: mereka dapat dengan mudah merusak versi iOS di masa depan jika Apple membuat perubahan dalam
UITableViewCell
hierarki subview.sumber
Kode versi Swift 3 tanpa menggunakan perpustakaan apa pun:
sumber
Anda perlu subkelas
UITableViewCell
metode subclass dan subclasswillTransitionToState:(UITableViewCellStateMask)state
yang dipanggil setiap kali pengguna menggesek sel. Itustate
bendera akan memberitahu Anda jika tombol Delete menunjukkan, dan menampilkan / menyembunyikan tombol More Anda di sana.Sayangnya metode ini tidak memberi Anda lebar tombol Delete atau waktu animasi. Jadi, Anda perlu mengamati & mengkode kode bingkai tombol More Anda dan waktu animasi ke dalam kode Anda (saya pribadi berpikir Apple perlu melakukan sesuatu tentang ini).
sumber
Untuk pemrograman cepat
sumber
INI BISA MEMBANTU ANDA KELUAR.
sumber
Saya mencari untuk menambahkan fungsionalitas yang sama ke aplikasi saya, dan setelah melalui begitu banyak tutorial yang berbeda ( raywenderlich menjadi solusi DIY terbaik), saya menemukan bahwa Apple memiliki
UITableViewRowAction
kelas sendiri , yang sangat berguna.Anda harus mengubah metode boilerpoint Tableview untuk ini:
Anda dapat mengetahui lebih lanjut tentang ini di Situs Ini . Dokumentasi Apple sendiri sangat berguna untuk mengubah warna latar belakang:
Jika Anda ingin mengubah font tombol, ini sedikit lebih rumit. Saya telah melihat pos lainnya di SO. Demi memberikan kode serta tautan, inilah kode yang mereka gunakan di sana. Anda harus mengubah tampilan tombol. Anda harus membuat referensi khusus ke tableviewcell, jika tidak Anda akan mengubah tampilan tombol di seluruh aplikasi Anda (saya tidak menginginkan itu, tetapi Anda mungkin, saya tidak tahu :))
Sasaran C:
Cepat:
Ini adalah versi IMHO termudah, dan paling stream-lined. Semoga ini bisa membantu.
Pembaruan: Inilah versi Swift 3.0:
sumber
shareMenu.
tidak mengambiladdAction
metode. Terima kasihSebenarnya Swift 3 Jawaban
Ini adalah fungsi HANYA yang Anda butuhkan. Anda tidak memerlukan fungsi CanEdit atau CommitEditingStyle untuk tindakan kustom.
sumber
Pada iOS 11 ini tersedia untuk umum di
UITableViewDelegate
. Berikut beberapa contoh kode:Juga tersedia:
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;
Documents: https://developer.apple.com/documentation/uikit/uitableviewdelegate/2902367-tableview?language=objc
sumber
Swift 4 & iOs 11+
sumber
Saya menggunakan tableViewCell untuk menampilkan banyak data, setelah menggesek () kanan ke kiri pada sel, ia akan menampilkan dua tombol Menyetujui dan menolak, ada dua metode, yang pertama adalah ApproveFunc yang mengambil satu argumen, dan yang lain adalah RejectFunc yang juga mengambil satu argumen.
sumber
Inilah cara yang agak rapuh untuk melakukannya yang tidak melibatkan API pribadi atau membangun sistem Anda sendiri. Anda melakukan hedging pada taruhan Anda bahwa Apple tidak melanggar ini dan semoga mereka akan merilis API yang dapat Anda ganti dengan beberapa baris kode ini.
Ini juga mengharuskan Anda menerapkan panggilan balik delegasi mengedit tampilan tabel tampilan standar.
sumber
Ada perpustakaan luar biasa yang disebut
SwipeCellKit
, itu harus mendapatkan pengakuan lebih. Menurut saya itu lebih keren daripadaMGSwipeTableCell
. Yang terakhir ini tidak sepenuhnya mereplikasi perilaku sel aplikasi Mail sementaraSwipeCellKit
itu. Silahkan lihatsumber
SwipeCellKit
dan terkesan ... sampai saya mendapatkan salah satu dari Pengecualian karena jumlah baris sebelum pembaruan tampilan tabel tidak sama dengan setelah pembaruan +/- perubahan dalam baris. Masalahnya, saya tidak pernah mengubah set data saya. Jadi jika itu tidak mengkhawatirkan, saya tidak tahu apa itu. Jadi saya memutuskan untuk tidak menggunakannya dan hanya menggunakan metode UITableViewDelegate yang baru. Jika Anda membutuhkan lebih banyak penyesuaian, Anda selalu dapat mengesampingkanwillBeginEditingRowAt: ....
Cepat 4
sumber
sourceView
adalah "Tampilan tempat tindakan ditampilkan." Untuk info lebih lanjut, cari "UIContextualAction.Handler".Inilah satu solusi sederhana. Ia mampu menampilkan dan menyembunyikan UIView khusus di dalam UITableViewCell. Logika tampilan terdapat di dalam kelas yang diperluas dari UITableViewCell, BaseTableViewCell.
BaseTableViewCell.h
BaseTableViewCell.M
Untuk mendapatkan fungsionalitas ini, cukup rentangkan sel tampilan tabel Anda dari BaseTableViewCell.
Selanjutnya, Inside UIViewController, yang mengimplementasikan UITableViewDelegate, membuat dua pengenal isyarat untuk menangani gesekan ke kiri dan kanan.
Daripada menambahkan dua penangan swipe
Sekarang, di dalam cellForRowAtIndexPath, dari UITableViewDelegate, Anda dapat membuat UIView khusus dan melampirkannya ke sel dequeued.
Tentu saja, cara memuat UIView khusus ini hanya untuk contoh ini. Kelola sesuai keinginan Anda.
sumber