اہم نکات
سوائپ اسکرین کی سطح پر انگلی کی ایک تیز سلائیڈنگ حرکت ہے جو انگلی اٹھانے پر ختم ہوتی ہے۔ سوائپ چھوٹا (کسی عنصر کو پلٹنا) یا لمبا (پردہ کھولنا) ہو سکتا ہے، لیکن اہم خصوصیت مجرد ہونا ہے: نظام اسے مسلسل کوآرڈینیٹ کے سلسلے کے طور پر نہیں بلکہ ایک واحد واقعہ کے طور پر پہچانتا ہے۔
موبائل آپریٹنگ سسٹم تین پیرامیٹرز کی بنیاد پر سوائپ کا پتہ لگاتے ہیں: کم از کم فاصلہ (حد)، کم از کم رفتار (velocity)، اور سمت۔ اگر انگلی آہستہ چلتی ہے یا فاصلہ ناکافی ہے، تو نظام اشارے کو پیننگ یا ٹیپ سے تعبیر کرتا ہے۔ حد کی قدریں پلیٹ فارمز کے درمیان مختلف ہوتی ہیں: iOS ایک مقررہ حد کے ساتھ UISwipeGestureRecognizer میں ایک مستقل استعمال کرتا ہے، Android ViewConfiguration.getScaledTouchSlop() استعمال کرتا ہے جو اسکرین کی کثافت کے لحاظ سے ~8–16 dp واپس کرتا ہے۔
Android Developers Documentation کے مطابق، GestureDetector میں onFling (سوائپ) 100 px/s سے زیادہ رفتار اور 50px سے فاصلے پر چالو ہوتا ہے۔ IT Sectr میں، ہم نیویگیشن (گیلریاں، کارڈ انٹرفیس، آن بورڈنگ) کے لیے سوائپ استعمال کرتے ہیں — یہ اشارہ ہر عمر کے صارفین کے لیے بدیہی ہے۔
سوائپ اور پیننگ (pan/drag) مختلف قسم کے اشارے ہیں، اگرچہ دونوں میں اسکرین پر انگلی حرکت دینا شامل ہے۔ سوائپ مجرد ہے اور اس کا مطلب ہے "ایک عمل انجام دینا،" جبکہ پیننگ مسلسل ہے اور اس کا مطلب ہے "کسی چیز کو حرکت دینا جب تک انگلی اسکرین پر ہے۔"
| پیرامیٹر | سوائپ (Swipe) | پین/ڈریگ (Pan/Drag) |
|---|---|---|
| قسم | مجرد | مسلسل |
| واقعات | ایک (پہچانا گیا/نہیں پہچانا گیا) | متعدد (.began → .changed → .ended) |
| رفتار | تیز (تیز حرکت) | کوئی بھی (آہستہ حرکت) |
| iOS مثال | UISwipeGestureRecognizer | UIPanGestureRecognizer |
| Android مثال | GestureDetector.onFling() | GestureDetector.onScroll() |
| منظر نامہ | ای میل حذف کرنا، صفحہ پلٹنا | نقشہ حرکت دینا، فائل گھسیٹنا |
| کوآرڈینیٹ ٹریکنگ | نہیں (صرف سمت) | ہاں (مسلسل کوآرڈینیٹ اپ ڈیٹ) |
سوائپ اور پیننگ کے درمیان انتخاب کام پر منحصر ہے۔ کسی عنصر پر عمل (حذف کرنا، آرکائیو کرنا، مینو کھولنا) کے لیے سوائپ استعمال کریں۔ براہ راست ہیرا پھیری (حرکت دینا، پیمانہ کرنا) کے لیے پیننگ استعمال کریں۔ ایک ہی عنصر پر اشاروں کو ملانے کے لیے require(toFail:) یا حسب ضرورت منطق کی ضرورت ہوتی ہے۔
UISwipeGestureRecognizer UIGestureRecognizer کا ایک ذیلی طبقہ ہے جو چار سمتوں میں سے ایک میں مجرد سوائپ کو پہچانتا ہے۔ UIPanGestureRecognizer کے برعکس، یہ درمیانی .changed واقعات پیدا نہیں کرتا: پہچانے جانے پر، عمل بالکل ایک بار کال کیا جاتا ہے۔
direction پراپرٹی (UISwipeGestureRecognizer.Direction) ٹریک کی گئی سمت متعین کرتی ہے — .left, .right, .up, .down۔ ماسک کے ذریعے سمتوں کو ملایا جا سکتا ہے: افقی سوائپ کے لیے [.left, .right]۔ numberOfTouchesRequired پراپرٹی انگلیوں کی تعداد متعین کرتی ہے — پہلے سے طے شدہ 1۔ UISwipeGestureRecognizer میں قابل ترتیب فاصلے کی حد نہیں ہے — iOS تقریباً 20px کی بلٹ ان ویلیو استعمال کرتا ہے، جو قابل اعتماد پہچان کے لیے کافی ہے۔
چونکہ UISwipeGestureRecognizer ایک مجرد پہچان کنندہ ہے، یہ UIPanGestureRecognizer سے متصادم نہیں ہوتا: آہستہ حرکت pan کو متحرک کرتی ہے، تیز حرکت swipe کو۔ تاہم، اسی ویو پر UITapGestureRecognizer کے ساتھ موجودگی میں، غلط ٹیپ پہچان کو روکنے کے لیے require(toFail:) کی ضرورت ہو سکتی ہے۔
Android میں، سوائپ پہچان کے لیے بنیادی API OnGestureListener کال بیک کے ساتھ GestureDetector ہے، خاص طور پر onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) طریقہ۔ GestureDetector انگلی کی ابتدائی اور آخری پوزیشن، محوروں کے ساتھ حرکت کی رفتار اور فاصلے کا تجزیہ کرتا ہے، اور حدیں عبور ہونے پر onFling کال کرتا ہے۔
کم از کم حدیں ViewConfiguration کے ذریعے ترتیب دی جاتی ہیں: VelocityTracker.getMinVelocity() (~100 px/s) اور ViewConfiguration.getScaledTouchSlop() (~8–16 dp)۔ ایک حسب ضرورت OnSwipeTouchListener ایک عام نمونہ ہے جو API کو آسان بناتا ہے: ڈویلپر کو دستی طور پر سمت اور رفتار کا حساب لگانے کی ضرورت نہیں ہے۔ Android Support Library میں بلٹ ان "SwipeDetector" شامل نہیں ہے، لہذا حسب ضرورت ریپر معیاری حل ہے۔
فہرستوں میں سوائپ کے لیے، Google RecyclerView سے ItemTouchHelper.SimpleCallback استعمال کرنے کی سفارش کرتا ہے، جو اشارے کی نشاندہی، اینیمیشن اور onSwiped() کال بیکس کو خلاصہ کرتا ہے۔ IT Sectr میں، ہم ViewPager2 اور کارڈ انٹرفیس کے لیے حسب ضرورت SwipeListener استعمال کرتے ہیں — یہ کارکردگی کو قربان کیے بغیر سوائپ حساسیت پر کنٹرول دیتا ہے۔
فہرستوں (UITableView, RecyclerView) کے لیے، Apple اور Google خصوصی APIs فراہم کرتے ہیں جو دستی طور پر UISwipeGestureRecognizer شامل کرنے کی جگہ لیتے ہیں۔ یہ APIs ایکشن بٹن، حسب ضرورت اینیمیشن اور "حذف کرنے کے لیے سوائپ کریں" اشارے کو سپورٹ کرتے ہیں — موبائل ایپلیکیشنز میں معیاری نمونے۔
iOS (11+) میں، UISwipeActionsConfiguration استعمال کیا جاتا ہے: tableView(_:leadingSwipeActionsConfigurationForRowAt:) طریقہ UIContextualAction کی ایک صف واپس کرتا ہے — عنوان، طرز (destructive, normal) اور ہینڈلر والے بٹن۔ مثال کے طور پر، "حذف کریں" — سرخ پس منظر کے ساتھ .destructive، "آرکائیو کریں" — سرمئی پس منظر کے ساتھ .normal۔ سسٹم بٹنوں کی ظاہری شکل کو متحرک کرتا ہے اور ٹیپ کے بعد completion بلاک کال کرتا ہے۔
Android میں، ItemTouchHelper.SimpleCallback ItemTouchHelper.attachToRecyclerView() کے ذریعے RecyclerView سے منسلک کیا جاتا ہے۔ پیرامیٹرز میں سمت کے جھنڈے (start, end, up, down) اور onSwiped(viewHolder, direction) کال بیک شامل ہیں۔ onSwiped کے اندر، اینیمیشن کے ساتھ آئٹم کو ہٹانے کے لیے adapter.notifyItemRemoved(position) کال کیا جاتا ہے۔ ItemTouchHelper خود بخود اشاروں، اسکرول تنازعات اور آئٹم کی واپسی کو ہینڈل کرتا ہے اگر سوائپ مکمل نہ ہو۔ Google I/O 2024 کے مطابق، فہرستوں میں سوائپ ایکشن والی 70% Android ایپلیکیشنز میں ItemTouchHelper استعمال ہوتا ہے۔
پچھلی اسکرین پر واپس جانے کے لیے ویو میں UISwipeGestureRecognizer شامل کرتا ہے۔ کوڈ .left سمت کے ساتھ کم سے کم پہچان کنندہ ترتیب دکھاتا ہے۔
import UIKit
class CardViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let swipeLeft = UISwipeGestureRecognizer(
target: self,
action: #selector(handleSwipeLeft(_:))
)
swipeLeft.direction = .left
swipeLeft.numberOfTouchesRequired = 1
view.addGestureRecognizer(swipeLeft)
}
@objc private func handleSwipeLeft(_: UISwipeGestureRecognizer) {
guard let nav = navigationController else { return }
if nav.viewControllers.count > 1 {
nav.popViewController(animated: true)
} else {
nav.dismiss(animated: true)
}
}
}
پہچان کنندہ کنٹرولر کے روٹ ویو سے منسلک ہوتا ہے۔ navigationController.viewControllers.count چیک اس بات کو یقینی بناتا ہے کہ pop صرف اس وقت انجام دیا جائے جب اسٹیک میں پچھلی اسکرین ہو۔ موڈل کنٹرولرز کے لیے، dismiss استعمال کیا جاتا ہے۔ کوڈ کو حالت چیک کرنے کی ضرورت نہیں ہے — UISwipeGestureRecognizer مجرد ہے اور صرف کامیاب پہچان پر عمل کو کال کرتا ہے۔
ایک سادہ GestureDetector ریپر لاگو کرتا ہے جو سوائپ کی سمت متعین کرتا ہے اور onSwipeLeft/Right کال بیکس کال کرتا ہے۔
import android.content.Context
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
open class OnSwipeTouchListener(context: Context) : View.OnTouchListener {
private val gestureDetector = GestureDetector(context, GestureListener())
override fun onTouch(v: View, event: MotionEvent): Boolean {
return gestureDetector.onTouchEvent(event)
}
private inner class GestureListener : GestureDetector.SimpleOnGestureListener() {
companion object {
private const val SWIPE_THRESHOLD = 100
private const val SWIPE_VELOCITY_THRESHOLD = 100
}
override fun onFling(
e1: MotionEvent?,
e2: MotionEvent,
velocityX: Float,
velocityY: Float
): Boolean {
val diffX = e2.x - e1!!.x
val diffY = e2.y - e1.y
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD
&& Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD
) {
if (diffX > 0) onSwipeRight()
else onSwipeLeft()
return true
}
} else {
if (Math.abs(diffY) > SWIPE_THRESHOLD
&& Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD
) {
if (diffY > 0) onSwipeDown()
else onSwipeUp()
return true
}
}
return false
}
}
open fun onSwipeLeft() {}
open fun onSwipeRight() {}
open fun onSwipeUp() {}
open fun onSwipeDown() {}
}
OnSwipeTouchListener onFling کو لاگو کرتے ہوئے SimpleOnGestureListener کو بڑھاتا ہے۔ diffX/diffY سمت متعین کرتے ہیں، SWIPE_THRESHOLD (100px) اور SWIPE_VELOCITY_THRESHOLD (100 px/s) حدیں ہیں۔ استعمال: view.setOnTouchListener(OnSwipeTouchListener(context).apply { onSwipeLeft = { dismiss() } })۔
ٹیبل سیل پر بائیں سوائپ کرنے پر حذف کرنے کا بٹن شامل کرتا ہے۔ دستی اشارہ پہچان کے بغیر بلٹ ان iOS 11+ API استعمال کرتا ہے۔
func tableView(
_ tableView: UITableView,
trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath
) -> UISwipeActionsConfiguration? {
let deleteAction = UIContextualAction(
style: .destructive,
title: "حذف کریں"
) { _, _, completionHandler in
items.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)
completionHandler(true)
}
deleteAction.backgroundColor = .systemRed
let config = UISwipeActionsConfiguration(actions: [deleteAction])
config.performsFirstActionWithFullSwipe = true
return config
}
طریقہ UIContextualAction کی ایک صف کے ساتھ UISwipeActionsConfiguration واپس کرتا ہے۔ style: .destructive خود بخود سرخ پس منظر متعین کرتا ہے۔ performsFirstActionWithFullSwipe = ہے۔true اضافی ٹیپ کے بغیر مکمل سوائپ کے ساتھ عمل کو انجام دینے کی اجازت دیتا ہے۔ IT Sectr میں، ہم ایکشن والی تمام فہرستوں کے لیے یہ API استعمال کرتے ہیں — یہ معیاری ہے، VoiceOver کو سپورٹ کرتا ہے اور حسب ضرورت GestureRecognizer کی ضرورت نہیں ہے۔
اکثر پوچھے گئے سوالات
سوائپ تیز حرکت اور انگلی اٹھانے کے ساتھ ایک مجرد اشارہ ہے، پیننگ کوآرڈینیٹ ٹریکنگ کے ساتھ مسلسل گھسیٹنا ہے۔ UISwipeGestureRecognizer ایک بار چالو ہوتا ہے، UIPanGestureRecognizer .began → .changed → .ended پیدا کرتا ہے۔ انتخاب منظر نامے پر منحصر ہے: سوائپ اعمال کے لیے (حذف کرنا، پلٹنا)، pan حرکت کے لیے (نقشہ، سلائیڈر)۔
اشارے کی منطق ایک جیسی ہے، لیکن API مختلف ہے۔ iOS direction کے ساتھ UISwipeGestureRecognizer استعمال کرتا ہے۔ Android حسب ضرورت حدود کے ساتھ GestureDetector.onFling() استعمال کرتا ہے۔ نتیجہ مختلف نفاذ کے ساتھ ایک جیسا UX ہے۔ کراس پلیٹ فارم فریم ورک (Flutter, React Native) ایک متحد سوائپ API کے ذریعے فرق کو خلاصہ کرتے ہیں۔
iOS (11+) میں، UITableViewDelegate میں UISwipeActionsConfiguration استعمال کریں۔ Android میں، RecyclerView کے لیے ItemTouchHelper.SimpleCallback استعمال کریں۔ یہ APIs دستی GestureRecognizer کی جگہ لیتے ہیں، ایکشن بٹن اور اینیمیشن کو سپورٹ کرتے ہیں، اسکرول تنازعات کو صحیح طریقے سے ہینڈل کرتے ہیں اور پلیٹ فارم HIG کے مطابق ڈھلتے ہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں