Gesture Recognizer — یہ کیا ہے، iOS میں ٹچ ہینڈلنگ

مصنف: IT Sectr اشاعت: 2026-02-27 مطالعے کا وقت: 8 منٹ
Gesture Recognizer UIKit میں ایک تجرید ہے جو صارف کے ٹچز کی ترتیب کو پہچانے گئے اشارے میں تبدیل کرتا ہے: ٹیپ، سوائپ، لمبا دباؤ، چٹکی یا گھماؤ۔ touchesBegan/touchesMoved طریقوں میں دستی طور پر کوآرڈینیٹ ٹریک کرنے کے بجائے، ڈویلپر UIView پر ایک تیار UIGestureRecognizer آبجیکٹ شامل کرتا ہے اور ایک ایکشن طریقہ نافذ کرتا ہے۔ Apple Developer Documentation کے مطابق، UIGestureRecognizer 7 بلٹ ان ذیلی طبقات کو سپورٹ کرتا ہے جو موبائل ایپلیکیشنز میں 95% عام اشارات کا احاطہ کرتے ہیں۔

اہم نکات

  • UIGestureRecognizer ٹچ پیٹرن کو پہچاننے کے لیے UIKit کا ایک تجریدی کلاس ہے: ٹیپ، سوائپ، چٹکی، گھماؤ اور لمبا دباؤ۔
  • 7 بلٹ ان ذیلی طبقات: UITapGestureRecognizer، UISwipeGestureRecognizer، UIPinchGestureRecognizer، UIRotationGestureRecognizer، UILongPressGestureRecognizer، UIPanGestureRecognizer، UIScreenEdgePanGestureRecognizer۔
  • ہر پہچان کنندہ کی ایک حالت (possible, began, changed, ended, cancelled, failed) ہوتی ہے جو انگلیوں کے حرکت کرنے پر اپ ڈیٹ ہوتی ہے۔
  • اشاروں کے درمیان تنازعات حل کرنے کے لیے، require(toFail:) طریقہ استعمال کیا جاتا ہے جو پہچان کی ترجیح متعین کرتا ہے۔
  • Gesture Recognizer SwiftUI میں UIKit اور UIViewRepresentable کے ساتھ کام کرتا ہے، لیکن مقامی SwiftUI اشارہ موڈیفائر استعمال کرتا ہے۔

Gesture Recognizer کیا ہے؟

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 کی حالتیں

ہر 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 چیک کریں — یہ اشارہ کے شروع، تبدیلی اور اختتام میں فرق کرنے کی اجازت دیتا ہے۔

iOS میں اشاروں کی اقسام

UIKit 7 بلٹ ان UIGestureRecognizer ذیلی طبقات فراہم کرتا ہے، جو زیادہ تر تعامل کے منظرناموں کا احاطہ کرتے ہیں۔ ہر ذیلی طبقہ میں مخصوص ترتیبات ہوتی ہیں: ٹیپ کے لیے numberOfTapsRequired، سوائپ کے لیے direction، لمبے دباؤ کے لیے minimumPressDuration۔

  • UITapGestureRecognizer — واحد اور متعدد ٹیپس کو پہچانتا ہے۔ ترتیب پذیر ٹیپس کی تعداد (numberOfTapsRequired) اور انگلیوں کی تعداد (numberOfTouchesRequired)۔ بٹن، لنکس، عنصر انتخاب کے لیے استعمال ہوتا ہے۔
  • UISwipeGestureRecognizer — چار سمتوں میں سے ایک میں سوائپ کو پہچانتا ہے (right, left, up, down)۔ direction پراپرٹی سمت متعین کرتی ہے؛ numberOfTouchesRequired انگلیوں کی تعداد متعین کرتی ہے۔
  • UIPanGestureRecognizer — گھسیٹنے کے لیے مسلسل اشارہ۔ translation(in:) طریقہ ابتدائی نقطہ سے نقل مکانی لوٹاتا ہے۔ ڈریگ اینڈ ڈراپ، کیروسل، پل ٹو رفرش کے لیے استعمال ہوتا ہے۔
  • UIPinchGestureRecognizer — دو انگلیوں سے اسکیلنگ۔ scale پراپرٹی موجودہ اسکیل فیکٹر کو ظاہر کرتی ہے۔ Pinch-to-Zoom مضمون میں تفصیل سے بیان کیا گیا ہے۔
  • UIRotationGestureRecognizer — دو انگلیوں سے گھماؤ۔ rotation پراپرٹی ریڈین میں زاویہ ذخیرہ کرتی ہے۔ تصاویر، نقشوں، کینوس کو گھمانے کے لیے استعمال ہوتا ہے۔
  • UILongPressGestureRecognizer — لمبا دباؤ۔ پیرامیٹرز: minimumPressDuration (سیکنڈ)، allowableMovement (پکسلز)۔ سیاق و سباق کے مینوز، عنصر گھسیٹنے کے لیے استعمال ہوتا ہے۔
  • UIScreenEdgePanGestureRecognizer — اسکرین کے کنارے سے پین کرنا۔ edges پراپرٹی متعین کرتی ہے کہ کس کنارے کو ٹریک کرنا ہے۔ نیویگیشن اشاروں، نوٹیفکیشن پینلز کے لیے استعمال ہوتا ہے۔

حسب ضرورت اشاروں کے لیے (مثال کے طور پر، زگ زیگ بنانا)، 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:) ترجیحات کے ساتھ ایک اشارہ اسکیما ہے — اس نے ڈبل ٹیپ فائرنگ کی خرابیوں کو مکمل طور پر ختم کر دیا۔

Swift میں کوڈ کی مثالیں

مثال 1: UITapGestureRecognizer — تصویر پر ٹیپ

UIImageView میں ایک سنگل ٹیپ ہینڈلر شامل کرتا ہے۔ ٹیپ کرنے پر، تصویر کی دھندلاپن تبدیل ہوتی ہے — ایک سادہ مثال جو ویو کے ساتھ اشارہ بائنڈنگ دکھاتی ہے۔

swift
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:) حاصل کیا جا سکتا ہے۔

مثال 2: UISwipeGestureRecognizer — نیویگیشن کے لیے سوائپ

پچھلی اسکرین پر واپس جانے کے لیے بائیں سوائپ کو نافذ کرتا ہے۔ سمت کی ترتیب اور کنٹرولر کی روٹ ویو میں اشارہ بائنڈنگ کو ظاہر کرتا ہے۔

swift
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۔ متعدد سمتوں کی حمایت کے لیے، ہر ایک کے لیے علیحدہ پہچان کنندہ بنائیں۔

مثال 3: require(toFail:) کے ساتھ اشارہ کا مجموعہ

دکھاتا ہے کہ کس طرح تنازع کے بغیر ایک ویو پر سنگل اور ڈبل ٹیپ ترتیب دیا جائے۔ ڈبل ٹیپ پہچان کنندہ کو ترجیح حاصل ہے — سنگل ٹیپ صرف اس وقت فائر ہوتا ہے جب ڈبل ٹیپ پہچانا نہ جائے۔

swift
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 میں، یہ پیٹرن امیج ایڈیٹرز اور گیلریوں میں استعمال ہوتا ہے، جہاں ڈبل ٹیپ زوم کرتا ہے اور سنگل ٹیپ ایک عنصر منتخب کرتا ہے۔

اکثر پوچھے گئے سوالات

کیا ایک ویو پر متعدد Gesture Recognizers استعمال کیے جا سکتے ہیں؟

ہاں، UIView بیک وقت متعدد UIGestureRecognizer مثالوں کو سپورٹ کرتا ہے۔ تنازعات حل کرنے کے لیے، require(toFail:) طریقہ استعمال کریں جو پہچان کا ترتیب متعین کرتا ہے۔ متوازی اشارہ آپریشن کے لیے (مثال کے طور پر، نقشے پر pan + pinch)، true لوٹانے والا gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:) ڈیلیگیٹ طریقہ نافذ کریں۔

UIGestureRecognizer touchesBegan سے کیسے مختلف ہے؟

UIGestureRecognizer ایک اعلیٰ سطحی تجرید ہے جو خود بخود ٹچ پیٹرن پہچانتا ہے اور حالتوں کا انتظام کرتا ہے۔ touchesBegan UIResponder کا ایک نچلی سطحی طریقہ ہے جس میں دستی کوآرڈینیٹ ٹریکنگ، ٹائمنگ اور ٹچ منسوخی کی ضرورت ہوتی ہے۔ Gesture Recognizer آسان، زیادہ قابل اعتماد اور معیاری اشاروں کے لیے ترجیح ہے؛ touchesBegan صرف حسب ضرورت گرافکس کے لیے جائز ہے۔

کیا Gesture Recognizer SwiftUI میں کام کرتا ہے؟

مقامی SwiftUI موڈیفائر استعمال کرتا ہے: onTapGesture، onLongPressGesture، DragGesture، MagnificationGesture، RotationGesture۔ یہ SwiftUI درجہ بندی میں ضم UIGestureRecognizer کے اعلانیہ مشابہ ہیں۔ اگر ضرورت ہو تو، UIViewRepresentable کے ذریعے UIKit پہچان کنندہ لپیٹا جا سکتا ہے، لیکن Apple مقامی SwiftUI اشارے استعمال کرنے کی سفارش کرتا ہے۔

خلاصہ

  • UIGestureRecognizer خودکار حالت کے انتظام کے ساتھ اشارہ پہچان کی منطق کو علیحدہ اشیاء میں تقسیم کرنے کے لیے UIKit میں ایک تجرید ہے۔
  • 7 بلٹ ان ذیلی طبقات 95% عام اشاروں کا احاطہ کرتے ہیں: ٹیپ، سوائپ، پین، چٹکی، گھماؤ، لمبا دباؤ اور کنارے سوائپ۔
  • ہر پہچان کنندہ .possible سے .ended/.failed تک 7 حالتوں سے گزرتا ہے، جو مجرد اور مسلسل اشاروں کی درست ٹریکنگ کو قابل بناتا ہے۔
  • require(toFail:) طریقہ پہچان کی ترجیح متعین کرکے ایک ویو پر اشاروں کے درمیان تنازعات حل کرتا ہے۔
  • SwiftUI اعلانیہ اشارہ موڈیفائر استعمال کرتا ہے، لیکن UIKit پہچان کنندہ UIViewRepresentable کے ذریعے دستیاب ہیں۔
  • Gesture Recognizer UIKit پروجیکٹس کے لیے لازمی ہے؛ touchesBegan صرف حسب ضرورت ڈرائنگ اور نچلی سطحی گرافکس کے لیے جائز ہے۔
  • ٹیپ/ڈبل ٹیپ جوڑوں کے لیے require(toFail:) اور متوازی اشاروں کے لیے gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:) استعمال کریں۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں