Objective-C
Di myCollectionViewController.h
file Anda, tambahkan UIGestureRecognizerDelegate
protokol
@interface myCollectionViewController : UICollectionViewController<UIGestureRecognizerDelegate>
di myCollectionViewController.m
file Anda :
- (void)viewDidLoad
{
// attach long press gesture to collectionView
UILongPressGestureRecognizer *lpgr
= [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.delegate = self;
lpgr.delaysTouchesBegan = YES;
[self.collectionView addGestureRecognizer:lpgr];
}
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
return;
}
CGPoint p = [gestureRecognizer locationInView:self.collectionView];
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:p];
if (indexPath == nil){
NSLog(@"couldn't find index path");
} else {
// get the cell at indexPath (the one you long pressed)
UICollectionViewCell* cell =
[self.collectionView cellForItemAtIndexPath:indexPath];
// do stuff with the cell
}
}
Cepat
class Some {
@objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
if gesture.state != .Ended {
return
}
let p = gesture.locationInView(self.collectionView)
if let indexPath = self.collectionView.indexPathForItemAtPoint(p) {
// get the cell at indexPath (the one you long pressed)
let cell = self.collectionView.cellForItemAtIndexPath(indexPath)
// do stuff with the cell
} else {
print("couldn't find index path")
}
}
}
let some = Some()
let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))
Cepat 4
class Some {
@objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
if gesture.state != .ended {
return
}
let p = gesture.location(in: self.collectionView)
if let indexPath = self.collectionView.indexPathForItem(at: p) {
// get the cell at indexPath (the one you long pressed)
let cell = self.collectionView.cellForItem(at: indexPath)
// do stuff with the cell
} else {
print("couldn't find index path")
}
}
}
let some = Some()
let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))
UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:indexPath];
referensi di sini harap semua ini pantas mendapatkan jawaban yang benar: Dlpgr.delaysTouchesBegan = YES;
untuk menghindarididHighlightItemAtIndexPath
pemicuan terlebih dahulu.lpgr.delegate = self;
? Ini berfungsi dengan baik tanpa delegasi, yang belum Anda sediakan.UIGestureRecognizerStateBegan
, jadi isyarat itu digunakan saat dikenali, bukan saat pengguna melepaskan jari mereka.Kode yang sama @ abbood kode untuk Swift:
Dalam viewDidLoad:
Dan fungsinya:
Jangan lupakan delegasi
UIGestureRecognizerDelegate
sumber
UIGestureRecognizerState.Ended
keUIGestureRecognizerState.Began
jika Anda ingin kode diaktifkan setelah durasi minimum berlalu, tidak hanya saat pengguna mengangkat jarinya.Gunakan delegasi UICollectionView menerima acara pers lama
Anda harus menerapkan 3 metode di bawah ini.
sumber
Jawaban di sini untuk menambahkan pengenal isyarat longpress kustom benar namun menurut dokumentasi di sini : kelas induk dari
UICollectionView
kelas menginstal adefault long-press gesture recognizer
untuk menangani interaksi pengguliran sehingga Anda harus menautkan pengenal isyarat tap kustom Anda ke pengenal default yang terkait dengan tampilan koleksi Anda.Kode berikut akan menghindari pengenal isyarat khusus Anda untuk mengganggu pengenal default:
sumber
The parent class of UICollectionView class installs a default tap gesture recognizer and a default long-press gesture recognizer to handle scrolling interactions. You should never try to reconfigure these default gesture recognizers or replace them with your own versions.
jadi pengenal tekan lama default dibuat untuk menggulir .. yang menyiratkan itu harus disertai dengan gerakan vertikal .. OP tidak bertanya tentang perilaku semacam itu dan dia juga tidak mencoba untuk menggantinyadan tambahkan metode seperti ini.
sumber
Untuk memiliki pengenal isyarat eksternal dan tidak bertentangan dengan pengenal isyarat internal di UICollectionView, Anda perlu:
Tambahkan pengenal gerakan Anda, atur dan tangkap referensi untuknya di suatu tempat (opsi terbaik ada di subkelas Anda jika Anda membuat subkelas UICollectionView)
Override standar metode inisialisasi
initWithFrame:collectionViewLayout:
daninitWithCoder:
dan menambahkan menyiapkan metode untuk Anda tekan lama isyarat recognizerTulis metode penyiapan Anda sehingga dapat membuat pengenal gerakan tekan lama, setel delegasinya, atur dependensi dengan pengenal gerakan UICollectionView (jadi itu menjadi gerakan utama dan semua gerakan lainnya akan menunggu sampai gerakan itu gagal sebelum dikenali) dan menambahkan gerakan ke tampilan
Juga jangan lupa untuk mengimplementasikan metode UIGestureRecognizerDelegate yang gagal memberikan isyarat tersebut dan memungkinkan pengenalan secara bersamaan (Anda mungkin atau mungkin tidak perlu mengimplementasikannya, itu tergantung pada pengenal isyarat lain yang Anda miliki atau ketergantungan dengan pengenal isyarat internal)
kredensial untuk itu masuk ke implementasi internal LXReorderableCollectionViewFlowLayout
sumber
Cepat 5:
Juga jangan lupa untuk mengimplementasikan UIGestureRecognizerDelegate dan memanggil setupLongGestureRecognizerOnCollection dari viewDidLoad atau di mana pun Anda perlu memanggilnya.
sumber
Mungkin, menggunakan UILongPressGestureRecognizer adalah solusi yang paling luas. Tapi saya menemui dua masalah yang mengganggu:
Izinkan saya menyarankan satu sedikit kekerasan, tetapi bekerja sesuai saran yang diperlukan:
Menyatakan deskripsi panggilan balik untuk klik lama pada sel kita:
typealias OnLongClickListener = (view: OurCellView) -> Void
Memperluas UICollectionViewCell dengan variabel (kita bisa menamakannya OurCellView, misalnya):
Menambahkan dua metode di kelas sel kita:
Dan acara sentuh utama di sini:
Kemudian di suatu tempat di pengontrol tampilan koleksi kami yang mendeklarasikan pemroses panggilan balik:
Dan terakhir di cellForItemAtIndexPath mengatur callback untuk sel kita:
Sekarang kita dapat menghentikan aksi klik panjang pada sel kita.
sumber