शायद, UILongPressGestureRecognizer का उपयोग करना सबसे व्यापक समाधान है। लेकिन मैं इसके साथ दो कष्टप्रद परेशानियों का सामना करता हूं:
- कभी-कभी यह पहचानकर्ता गलत तरीके से काम करता है जब हम अपना स्पर्श कर रहे होते हैं;
- पहचानकर्ता अन्य स्पर्श क्रियाओं को स्वीकार करता है, इसलिए हम अपने यूआईसीओलेक्शन व्यू के हाइलाइट कॉलबैक का उचित तरीके से उपयोग नहीं कर सकते हैं।
मुझे एक छोटे से bruteforce सुझाव देते हैं, लेकिन यह आवश्यक सुझाव के रूप में काम कर रहा है:
हमारे सेल पर लंबे समय के लिए कॉलबैक विवरण की घोषणा:
typealias OnLongClickListener = (view: OurCellView) -> Void
चरों के साथ UICollectionViewCell का विस्तार करना (हम इसका नाम OurCellView रख सकते हैं, उदाहरण के लिए):
/// 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
हमारे सेल वर्ग में दो विधियाँ जोड़ना:
/**
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)
}
और यहां स्पर्श की घटनाओं को ओवरराइड करना:
/// 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)
}
फिर कॉलबैक श्रोता घोषित करने वाले हमारे संग्रह दृश्य के नियंत्रक में कहीं:
let longClickListener: OnLongClickListener = {view in
print("Long click was performed!")
}
और अंत में cellForItemAtIndexPath में हमारे सेल के लिए कॉलबैक सेटिंग:
/// 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
}
अब हम अपनी कोशिकाओं पर लंबी क्लिक क्रियाओं को रोक सकते हैं।
UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:indexPath];
संदर्भ यहाँ उम्मीद है कि यह सब एक सही जवाब पुरस्कार की योग्यता: डी