اہم نکات
UIGestureRecognizer UIKit میں ایک تجریدی بنیادی کلاس ہے جو اشارہ پہچان کے عمل کو علیحدہ اشیاء میں تقسیم کرتا ہے۔ ہر ذیلی طبقہ ایک اشارہ کی قسم کو ہینڈل کرتا ہے: UITapGestureRecognizer مخصوص تعداد میں ٹچز کے ٹیپ کو ہینڈل کرتا ہے، UISwipeGestureRecognizer ایک مخصوص سمت میں سوائپ کو ہینڈل کرتا ہے۔ ڈویلپر addGestureRecognizer(:) طریقہ کے ذریعے UIView پر پہچان کنندہ شامل کرتا ہے، اور UIKit خود بخود ٹچز کو ٹریک کرتا ہے، حالت اپ ڈیٹ کرتا ہے اور پہچان پر ایکشن کال کرتا ہے۔
UIGestureRecognizer (iOS 3.2، 2010) سے پہلے، ڈویلپر UIResponder طریقوں — touchesBegan، touchesMoved، touchesEnded — کو اوور رائڈ کرتے تھے اور دستی طور پر ٹچ کی رفتار کا تجزیہ کرتے تھے۔ اس سے کوڈ کی نقل اور بیک وقت ٹچز کو ہینڈل کرنے میں خرابیاں پیدا ہوتی تھیں۔ Apple نے اس منطق کو UIGestureRecognizer میں سمیٹ لیا، ملٹی ٹچ، اشارہ منسوخی اور ایک ویو پر متعدد پہچان کنندگان کے بیک وقت آپریشن کی حمایت شامل کی۔
WWDC سیشنز کے مطابق، Gesture Recognizer iPad پر 11 بیک وقت ٹچز اور iPhone پر 5 تک ہینڈل کرتا ہے۔ IT Sectr میں، ہم تمام UIKit پروجیکٹس میں صارف کے ان پٹ کو ہینڈل کرنے کے معیاری طریقہ کے طور پر UIGestureRecognizer استعمال کرتے ہیں — اس نے دستی touchesBegan ٹریکنگ سے وابستہ خرابیوں کو ختم کر دیا۔
ہر UIGestureRecognizer 7 ممکنہ حالتوں سے گزرتا ہے، جو UIGestureRecognizer.State انم میں متعین ہیں۔ یہ حالتیں پہچان کی زندگی کے دور کو ظاہر کرتی ہیں: ٹچ کا پتہ لگانے سے لے کر تکمیل یا منسوخی تک۔ حالتوں کو سمجھنا حسب ضرورت پہچان کنندگان کو نافذ کرنے اور تنازعات کو ڈیبگ کرنے کے لیے اہم ہے۔
| حالت | معنی | کب ہوتی ہے |
|---|---|---|
| .possible | ابتدائی حالت، اشارہ ابھی تک پہچانا نہیں گیا | ویو میں شامل کرنے کے فوراً بعد |
| .began | اشارہ پہچانا گیا اور عمل درآمد شروع ہوا | pan/longPress کے لیے پہلی انگلی کی حرکت پر |
| .changed | اشارہ کے پیرامیٹرز تبدیل ہوئے (کوآرڈینیٹ، زاویہ) | ہر انگلی کی حرکت پر |
| .ended | صارف نے انگلی اٹھا لی، اشارہ مکمل ہوا | touchesEnded پر |
| .cancelled | نظام کی طرف سے اشارہ روک دیا گیا (آنے والی کال، سمت تبدیل) | touchesCancelled پر |
| .failed | شرائط کے مطابق اشارہ پہچانا نہیں گیا | پہچان کے بغیر touchesCancelled پر |
| .recognized | .ended کا مترادف؛ اشارہ کامیابی سے پہچانا گیا | .ended کی طرح |
مجرد اشارے (tap، swipe) .possible سے براہ راست .ended یا .failed میں جاتے ہیں۔ مسلسل اشارے (pan، pinch، rotation، longPress) .possible → .began → .changed (بار بار) → .ended سے گزرتے ہیں۔ ایکشن طریقہ میں gestureRecognizer.state چیک کریں — یہ اشارہ کے شروع، تبدیلی اور اختتام میں فرق کرنے کی اجازت دیتا ہے۔
UIKit 7 بلٹ ان UIGestureRecognizer ذیلی طبقات فراہم کرتا ہے، جو زیادہ تر تعامل کے منظرناموں کا احاطہ کرتے ہیں۔ ہر ذیلی طبقہ میں مخصوص ترتیبات ہوتی ہیں: ٹیپ کے لیے numberOfTapsRequired، سوائپ کے لیے direction، لمبے دباؤ کے لیے minimumPressDuration۔
حسب ضرورت اشاروں کے لیے (مثال کے طور پر، زگ زیگ بنانا)، touchesBegan، touchesMoved، touchesEnded کو اوور رائڈ کرکے اور حالت اپ ڈیٹ کرکے UIGestureRecognizer کا ذیلی طبقہ بنایا جاتا ہے۔ Apple جہاں ممکن ہو بلٹ ان کلاسز استعمال کرنے کی سفارش کرتا ہے — وہ بہتر بنائی گئی ہیں اور ایک دوسرے کے ساتھ صحیح طریقے سے تعامل کرتی ہیں۔
جب ایک UIView پر متعدد UIGestureRecognizer استعمال کیے جاتے ہیں (مثال کے طور پر، ٹیپ اور ڈبل ٹیپ)، تو پہچان کا تنازع ہوتا ہے: ڈبل ٹیپ پر، سنگل ٹیپ پہلے فائر ہوتا ہے۔ Apple require(toFail:) طریقہ فراہم کرتا ہے تاکہ ایک اشارہ کی پہچان میں اس وقت تک تاخیر ہو جب تک دوسرا ناکام نہ ہو جائے۔
میکانزم اس طرح کام کرتا ہے: tapRecognizer.require(toFail: doubleTapRecognizer) کال کرکے، آپ متعین کرتے ہیں کہ tapRecognizer .recognized حالت میں تب ہی جائے گا جب doubleTapRecognizer .failed میں ختم ہوگا۔ یہ سنگل ٹیپ کو انجام دینے سے پہلے ~0.3 سیکنڈ کی تاخیر کا اضافہ کرتا ہے — صارف دو بار ٹیپ کرتا ہے اور پہلا ٹیپ نظر انداز کر دیا جاتا ہے۔ متبادل طریقہ UIGestureRecognizerDelegate ہے جس میں gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:) طریقہ ہے، جو بیک وقت پہچان کی اجازت دیتا ہے (مثال کے طور پر، نقشے کے لیے pan + pinch)۔
WWDC 2020 کے مطابق، UIKit ایپلیکیشنز میں تقریباً 15% خرابیاں اشارہ تنازعات کی غلط ترتیب سے متعلق ہیں۔ IT Sectr میں، ہم نے طریقہ کار کو معیاری بنایا: ہر اسکرین میں require(toFail:) ترجیحات کے ساتھ ایک اشارہ اسکیما ہے — اس نے ڈبل ٹیپ فائرنگ کی خرابیوں کو مکمل طور پر ختم کر دیا۔
UIImageView میں ایک سنگل ٹیپ ہینڈلر شامل کرتا ہے۔ ٹیپ کرنے پر، تصویر کی دھندلاپن تبدیل ہوتی ہے — ایک سادہ مثال جو ویو کے ساتھ اشارہ بائنڈنگ دکھاتی ہے۔
import UIKit
class ImageViewController: UIViewController {
@IBOutlet private var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(
target: self,
action: #selector(handleTap(_:))
)
tap.numberOfTapsRequired = 1
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true
}
@objc private func handleTap(_: UITapGestureRecognizer) {
UIView.animate(withDuration: 0.2) {
self.imageView.alpha = self.imageView.alpha == 1.0 ? 0.5 : 1.0
}
}
}
اہم نکتہ: UIImageView پر isUserInteractionEnabled ڈیفالٹ طور پر false ہے — اس جھنڈے کے بغیر، Gesture Recognizer کو ٹچز نہیں ملیں گے۔ UIView اور UIButton کے لیے، یہ جھنڈا ڈیفالٹ طور پر فعال ہے۔ ایکشن طریقہ UITapGestureRecognizer پیرامیٹر قبول کرتا ہے، جس کے ذریعے ٹیپ کوآرڈینیٹ تعین کرنے کے لیے location(in:) حاصل کیا جا سکتا ہے۔
پچھلی اسکرین پر واپس جانے کے لیے بائیں سوائپ کو نافذ کرتا ہے۔ سمت کی ترتیب اور کنٹرولر کی روٹ ویو میں اشارہ بائنڈنگ کو ظاہر کرتا ہے۔
import UIKit
class DetailViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let swipeLeft = UISwipeGestureRecognizer(
target: self,
action: #selector(handleSwipe(_:))
)
swipeLeft.direction = .left
view.addGestureRecognizer(swipeLeft)
}
@objc private func handleSwipe(_: UISwipeGestureRecognizer) {
navigationController?.popViewController(animated: true)
}
}
UISwipeGestureRecognizer ایک مجرد اشارہ ہے: یہ پہچان کے فوراً بعد .recognized میں چلا جاتا ہے، بغیر درمیانی .changed حالتوں کے۔ لہذا، ایکشن میں حالت چیک کرنے کی ضرورت نہیں ہے — اشارہ یا تو پہچانا جاتا ہے (ایکشن فائر ہوتا ہے) یا نہیں۔ direction پراپرٹی چار اقدار میں سے ایک قبول کرتی ہے: .left، .right، .up، .down۔ متعدد سمتوں کی حمایت کے لیے، ہر ایک کے لیے علیحدہ پہچان کنندہ بنائیں۔
دکھاتا ہے کہ کس طرح تنازع کے بغیر ایک ویو پر سنگل اور ڈبل ٹیپ ترتیب دیا جائے۔ ڈبل ٹیپ پہچان کنندہ کو ترجیح حاصل ہے — سنگل ٹیپ صرف اس وقت فائر ہوتا ہے جب ڈبل ٹیپ پہچانا نہ جائے۔
import UIKit
class TapViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let singleTap = UITapGestureRecognizer(
target: self,
action: #selector(handleSingleTap)
)
singleTap.numberOfTapsRequired = 1
let doubleTap = UITapGestureRecognizer(
target: self,
action: #selector(handleDoubleTap)
)
doubleTap.numberOfTapsRequired = 2
singleTap.require(toFail: doubleTap)
view.addGestureRecognizer(singleTap)
view.addGestureRecognizer(doubleTap)
}
@objc private func handleSingleTap() {
print("Single tap — after 0.3s delay")
}
@objc private func handleDoubleTap() {
print("Double tap — instant")
}
}
require(toFail:) کے بغیر، ڈبل ٹیپ پر، پہلے handleSingleTap فائر ہوتا ہے، پھر handleDoubleTap — یہ UX کو توڑ دیتا ہے۔ require(toFail:) کے ساتھ، سنگل ٹیپ ~0.3 سیکنڈ انتظار کرتا ہے تاکہ یہ یقینی بنایا جا سکے کہ دوسرا ٹیپ نہیں آتا۔ IT Sectr میں، یہ پیٹرن امیج ایڈیٹرز اور گیلریوں میں استعمال ہوتا ہے، جہاں ڈبل ٹیپ زوم کرتا ہے اور سنگل ٹیپ ایک عنصر منتخب کرتا ہے۔
اکثر پوچھے گئے سوالات
ہاں، UIView بیک وقت متعدد UIGestureRecognizer مثالوں کو سپورٹ کرتا ہے۔ تنازعات حل کرنے کے لیے، require(toFail:) طریقہ استعمال کریں جو پہچان کا ترتیب متعین کرتا ہے۔ متوازی اشارہ آپریشن کے لیے (مثال کے طور پر، نقشے پر pan + pinch)، true لوٹانے والا gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:) ڈیلیگیٹ طریقہ نافذ کریں۔
UIGestureRecognizer ایک اعلیٰ سطحی تجرید ہے جو خود بخود ٹچ پیٹرن پہچانتا ہے اور حالتوں کا انتظام کرتا ہے۔ touchesBegan UIResponder کا ایک نچلی سطحی طریقہ ہے جس میں دستی کوآرڈینیٹ ٹریکنگ، ٹائمنگ اور ٹچ منسوخی کی ضرورت ہوتی ہے۔ Gesture Recognizer آسان، زیادہ قابل اعتماد اور معیاری اشاروں کے لیے ترجیح ہے؛ touchesBegan صرف حسب ضرورت گرافکس کے لیے جائز ہے۔
مقامی SwiftUI موڈیفائر استعمال کرتا ہے: onTapGesture، onLongPressGesture، DragGesture، MagnificationGesture، RotationGesture۔ یہ SwiftUI درجہ بندی میں ضم UIGestureRecognizer کے اعلانیہ مشابہ ہیں۔ اگر ضرورت ہو تو، UIViewRepresentable کے ذریعے UIKit پہچان کنندہ لپیٹا جا سکتا ہے، لیکن Apple مقامی SwiftUI اشارے استعمال کرنے کی سفارش کرتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں