সম্ভবত, ইউআইএলংপ্রেসজেস্টাররেকগনিজার ব্যবহার করা সর্বাধিক বিস্তৃত সমাধান। তবে আমি এর সাথে দুটি বিরক্তিকর সমস্যার মুখোমুখি হয়েছি:
- কখনও কখনও যখন আমরা আমাদের স্পর্শটি সরিয়ে রাখি তখন এই সনাক্তকারীটি ভুল উপায়ে কাজ করে;
- সনাক্তকারী অন্যান্য স্পর্শ ক্রিয়াকে বাধা দেয় যাতে আমরা আমাদের ইউআইকোলিকেশনভিউয়ের হাইলাইট কলব্যাকগুলি সঠিক উপায়ে ব্যবহার করতে পারি না।
আমাকে কিছুটা ব্রুটফোর্স পরামর্শ দিন, তবে এটির মতো পরামর্শের প্রয়োজন হিসাবে কাজ করছেন:
আমাদের সেলটিতে দীর্ঘ ক্লিকের জন্য কলব্যাকের বিবরণ ঘোষণা করা:
typealias OnLongClickListener = (view: OurCellView) -> Void
ভেরিয়েবলগুলির সাথে ইউআইকোলিকেশনভিউসেল প্রসারিত করা হচ্ছে (উদাহরণস্বরূপ আমরা এটি আওয়ারসেলভিউর নাম দিতে পারি):
/// 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!")
}
এবং অবশেষে সেলফোরআইটেমএন্টেক্সপথটিতে আমাদের সেলগুলির জন্য কলব্যাক সেটিং করা হয়েছে:
/// 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];
রেফারেন্স আশা করি এই সমস্তই সঠিক উত্তর পুরষ্কারের যোগ্যতা: ডি