บางทีการใช้UILongPressGestureRecognizerเป็นวิธีแก้ปัญหาที่แพร่หลายที่สุด แต่ฉันพบกับปัญหาที่น่ารำคาญสองประการ:
- บางครั้งเครื่องมือจดจำนี้ทำงานผิดวิธีเมื่อเราขยับสัมผัส
- โปรแกรมจดจำจะสกัดกั้นการสัมผัสอื่น ๆ ดังนั้นเราจึงไม่สามารถใช้ไฮไลต์เรียกกลับของ UICollectionView ของเราได้อย่างเหมาะสม
ให้ฉันแนะนำ 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];
อ้างอิงที่นี่หวังว่าทั้งหมดนี้จะได้รับรางวัลคำตอบที่ถูกต้อง: D