아마도 UILongPressGestureRecognizer를 사용 하는 것이 가장 널리 퍼진 솔루션 일 것입니다. 그러나 나는 두 가지 성가신 문제에 직면합니다.
- 때때로이 인식기는 터치를 움직일 때 잘못된 방식으로 작동합니다.
- 인식기는 다른 터치 액션을 가로 채서 UICollectionView의 하이라이트 콜백을 적절한 방식으로 사용할 수 없습니다.
약간의 무차별 대입을 제안하지만 제안이 필요한대로 작동합니다.
셀에 대한 긴 클릭에 대한 콜백 설명 선언 :
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