Mungkin, menggunakan UILongPressGestureRecognizer adalah solusi yang paling luas. Tapi saya menemui dua masalah yang mengganggu:
- terkadang pengenal ini bekerja dengan cara yang salah saat kita menggerakkan sentuhan;
- pengenal mencegat tindakan sentuh lainnya sehingga kami tidak dapat menggunakan panggilan balik sorotan dari UICollectionView kami dengan cara yang benar.
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):
/// To catch long click events.
private var longClickListener: OnLongClickListener?
/// To check if we are holding button pressed long enough.
var longClickTimer: NSTimer?
/// Time duration to trigger long click listener.
private let longClickTriggerDuration = 0.5
Menambahkan dua metode di kelas sel kita:
/**
Sets optional callback to notify about long click.
- Parameter listener: A callback itself.
*/
func setOnLongClickListener(listener: OnLongClickListener) {
self.longClickListener = listener
}
/**
Getting here when long click timer finishs normally.
*/
@objc func longClickPerformed() {
self.longClickListener?(view: self)
}
Dan acara sentuh utama di sini:
/// Intercepts touch began action.
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
longClickTimer = NSTimer.scheduledTimerWithTimeInterval(self.longClickTriggerDuration, target: self, selector: #selector(longClickPerformed), userInfo: nil, repeats: false)
super.touchesBegan(touches, withEvent: event)
}
/// Intercepts touch ended action.
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
longClickTimer?.invalidate()
super.touchesEnded(touches, withEvent: event)
}
/// Intercepts touch moved action.
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
longClickTimer?.invalidate()
super.touchesMoved(touches, withEvent: event)
}
/// Intercepts touch cancelled action.
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
longClickTimer?.invalidate()
super.touchesCancelled(touches, withEvent: event)
}
Kemudian di suatu tempat di pengontrol tampilan koleksi kami yang mendeklarasikan pemroses panggilan balik:
let longClickListener: OnLongClickListener = {view in
print("Long click was performed!")
}
Dan terakhir di cellForItemAtIndexPath mengatur callback untuk sel kita:
/// Data population.
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath)
let castedCell = cell as? OurCellView
castedCell?.setOnLongClickListener(longClickListener)
return cell
}
Sekarang kita dapat menghentikan aksi klik panjang pada sel kita.
UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:indexPath];
referensi di sini harap semua ini pantas mendapatkan jawaban yang benar: D