Long Press هي إيماءة ضغط مطول حيث يبقى الإصبع على الشاشة لفترة زمنية محددة (عادة 0.5–1 ثانية) دون تحريك. على عكس Tap، يتم التعرف على Long Press ليس في لحظة اللمس، بل بعد انتهاء مؤقت التأخير. تُستخدم الإيماءة لاستدعاء قائمة سياقية، معاينة المحتوى، تحديد عدة كائنات، وتفعيل إجراءات إضافية. يتم تنفيذها في iOS عبر UILongPressGestureRecognizer، وفي Android عبر setOnLongClickListener أو GestureDetector.
النقاط الرئيسية
Long Press (الضغط المطول، اللمس الطويل) هي إيماءة واجهة متعددة اللمس حيث يلمس المستخدم الشاشة ويبقي الإصبع ثابتاً لمدة زمنية محددة. لا يتفاعل النظام فوراً: ينتظر مهلة (عادة 500 مللي ثانية)، وفقط بعد انتهائها يتعرف على الإيماءة كـ Long Press. إذا تم رفع الإصبع مبكراً، تُفسر الإيماءة كضغطة Tap عادية.
هذه الإيماءة هي لبنة بناء أساسية لواجهات الأجهزة المحمولة الحديثة. تستخدمها Apple لاستدعاء القوائم السياقية في التطبيقات (Messages، Safari، Files). أدمجت Google Long Press في تحديد النص، إعادة ترتيب الأيقونات على الشاشة الرئيسية، واستدعاء القوائم السياقية في Android. في واجهات الويب، يحاكي الضغط المطول غالباً النقر بزر الماوس الأيمن على الأجهزة المحمولة حيث لا يوجد زر أيمن فعلي.
تاريخياً، ظهر Long Press كبديل للقائمة السياقية (النقر الأيمن) للشاشات اللمسية. ظهرت التطبيقات الأولى على أجهزة ذات شاشات مقاومة (Palm، Windows Mobile في أوائل الألفينيات)، لكن الإيماءة توحدت فقط مع ظهور iPhone وAndroid. تصف إرشادات واجهة المستخدم البشرية لكلا المنصتين Long Press كإجراء ثانوي — ليس بديلاً عن Tap، بل توسيعاً للوظائف.
Long Press وTap إيماءتان مختلفتان بدلالات مختلفة. Tap هي ضغطة فورية: يلمس الإصبع الشاشة ويرفع خلال 100–300 مللي ثانية. Tap دائماً إجراء رئيسي: فتح تطبيق، الضغط على زر، اتباع رابط. Long Press هو إجراء ثانوي: فتح قائمة سياقية، بدء التحرير، عرض معلومات إضافية.
| المعامل | Tap | Long Press |
|---|---|---|
| مدة الإمساك | 100–300 مللي ثانية | 500–1000 مللي ثانية |
| نوع الإجراء | رئيسي (primary) | ثانوي (secondary) |
| أمثلة | فتح رابط، الضغط على زر | قائمة سياقية، تحرير |
| التغذية الراجعة | بصرية (تسليط الضوء) | لمسية (تغذية راجعة لمسية) |
| API iOS | UITapGestureRecognizer | UILongPressGestureRecognizer |
| API Android | setOnClickListener | setOnLongClickListener |
قاعدة أساسية: لا تستخدم Long Press أبداً كالطريقة الوحيدة لتنفيذ إجراء. يتوقع المستخدمون أن Tap ينفذ الإجراء الرئيسي، وأن Long Press يفتح خيارات إضافية. انتهاك هذا المبدأ (مثل اشتراط ضغط مطول لفتح رابط) يؤدي إلى تجربة مستخدم سلبية وتقليل إمكانية الوصول.
UILongPressGestureRecognizer هو المعرف القياسي للإيماءات في iOS SDK لمعالجة الضغط المطول. يرث من UIGestureRecognizer ويدعم تكوين المدة الدنيا، الحركة المسموح بها للإصبع، وعدد اللمسات. ينتقل المعرف إلى الحالة UIGestureRecognizerStateBegan بعد انتهاء المؤقت، ثم إلى UIGestureRecognizerStateChanged عند تحريك الإصبع، وUIGestureRecognizerStateEnded عند الرفع.
// UILongPressGestureRecognizer مع تكوين المدة الدنيا
class ContextMenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(handleLongPress(_:))
)
// الحد الأدنى لمدة الإمساك: 0.5 ثانية
longPressRecognizer.minimumPressDuration = 0.5
// الحركة المسموح بها للإصبع: 10 نقاط
longPressRecognizer.allowableMovement = 10
customView.addGestureRecognizer(longPressRecognizer)
}
@objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
guard recognizer.state == .began else { return }
// إنشاء قائمة سياقية
let location = recognizer.location(in: self.view)
ContextMenuPresenter.show(at: location)
}
}معلمات التكوين: minimumPressDuration — الوقت بالثواني قبل التفعيل (افتراضياً 0.5، للوصولية يُوصى بـ 0.65+)؛ allowableMovement — أقصى حركة للإصبع بالنقاط (افتراضياً 10، زيادتها تساعد مع الأيدي غير المستقرة). يدعم iOS numberOfTouchesRequired للإيماءات متعددة اللمس (مثل الضغط المطول بإصبعين). يتكامل المعرف أيضاً مع UIContextMenuInteraction — عند إضافة قائمة سياقية إلى UIView عبر UIContextMenuConfiguration، يستدعي Long Press القائمة السياقية تلقائياً دون تنفيذ يدوي للإيماءة.
setOnLongClickListener هي طريقة View في Android SDK تقوم بتعيين مستمع للضغط المطول. عندما يمسك المستخدم بـ View لأكثر من 500 مللي ثانية، يستدعي النظام onLongClick(). ترجع الطريقة قيمة منطقية — true تعني أن الحدث تمت معالجته ولا يجب أن ينتقل أكثر، false تعني أن الحدث يمكن معالجته بواسطة مستمعين آخرين. للمعالجة الأكثر تعقيداً (حركة الإصبع بعد بدء Long Press)، يُستخدم GestureDetector مع OnGestureListener.
// مثال setOnLongClickListener مع تغذية راجعة لمسية
val itemView: View = findViewById(R.id.itemView)
itemView.setOnLongClickListener {
// استجابة لمسية لتأكيد بدء الإيماءة
it.performHapticFeedback(
HapticFeedbackConstants.LONG_PRESS
)
// عرض القائمة السياقية في موضع العنصر
val popup = PopupMenu(this, it)
popup.menuInflater.inflate(R.menu.context_menu, popup.menu)
popup.show()
true // تمت معالجة الحدث
}GestureDetector يوفر تحكماً أدق في الإيماءة. على عكس setOnLongClickListener، يخطر GestureDetector عن البداية (onLongPress)، الحركة (onScroll)، والرفع. يتيح ذلك سيناريوهات معقدة — مثلاً، بدء السحب بعد الضغط المطول (Drag-and-Drop). يتطلب OnGestureListener تنفيذ ستة طرق: onDown، onShowPress، onSingleTapUp، onScroll، onLongPress، onFling.
Long Press يُستخدم في عشرات السيناريوهات لواجهات الأجهزة المحمولة. التطبيق الأكثر شيوعاً هو القائمة السياقية: الضغط المطول على جهة اتصال يظهر خيارات الاتصال (اتصال، رسالة، بريد)، على ملف — خيارات (نسخ، نقل، حذف)، على نص — التحديد والحافظة. يستخدم مشغل Android الضغط المطول على أيقونة لتحريك التطبيقات وإضافة الأدوات.
تحديد النص هو مثال كلاسيكي لـ Long Press على كلا المنصتين. في iOS، الضغط المطول على نص ينشط عدسة مكبرة لتحديد موضع المؤشر؛ على كلمة — يحددها مع علامات. في Android، الضغط المطول يحدد الكلمة بأكملها ويظهر شريط إجراءات (نسخ، قص، لصق). تستخدم كلتا المنصتين سحب العلامات اللاحق لتوسيع التحديد.
المعاينة — في iOS، الضغط المطول على رابط في Safari أو رسالة في Mail يفتح معاينة للمحتوى (peek). في Android، يتم تنفيذ سلوك مماثل عبر Long Press على إشعار (يوسع الإشعار مع أزرار الإجراءات). تستخدم تطبيقات الصور الضغط المطول على الصورة المصغرة لمعاينة سريعة للصورة.
السحب والإفلات (Drag-and-Drop) غالباً ما يبدأ بـ Long Press. يمسك المستخدم بالعنصر، يتحول النظام إلى وضع السحب، وحركة الإصبع تنقل العنصر عبر الشاشة. يدعم Android هذا السيناريو عبر View.startDragAndDrop() بعد Long Press. يستخدم iOS UIDragInteraction، حيث يتطلب تفاعل السحب ضغطاً مطولاً لبدء السحب.
إرشادات واجهة المستخدم البشرية لكلا المنصتين تقدم توصيات واضحة: يجب أن يكون Long Press دائماً إجراءً ثانوياً. لا تجعل الضغط المطول أبداً الطريقة الوحيدة لتنفيذ وظيفة حرجة. المستخدمون يجربون Tap أولاً — إذا لم يعمل Tap كما هو متوقع، يشعرون بالإحباط. أضف إشارات بصرية: يمكن الإشارة إلى القوائم السياقية بأيقونة ثلاث نقاط، والعناصر التي تدعم Long Press بتلميح بصري عند اللمس.
التغذية الراجعة اللمسية إلزامية لـ Long Press. عندما يتم التعرف على الإيماءة، يجب على الجهاز تأكيد ذلك باستجابة لمسية: في iOS هذا UIImpactFeedbackGenerator بنبضة خفيفة، في Android — HapticFeedbackConstants.LONG_PRESS. بدون تغذية راجعة لمسية، لا يكون المستخدم متأكداً من تسجيل الإيماءة وقد يضغط مرة أخرى مسبباً إجراءات غير مرغوب فيها.
| التوصية | iOS | Android |
|---|---|---|
| مهلة التعرف | 0.5–0.65 ثانية | 500 مللي ثانية (افتراضي) |
| التغذية الراجعة اللمسية | UIImpactFeedbackGenerator | HapticFeedbackConstants.LONG_PRESS |
| التغذية الراجعة البصرية | قائمة سياقية، تسليط الضوء | PopupMenu، رسم متحرك ripple |
| إمكانية الوصول | VoiceOver + Custom Actions | TalkBack + AccessibilityNodeInfo |
| أقصى حركة للإصبع | allowableMovement = 10 نقطة | TouchSlop (~8 dp افتراضياً) |
| تعارض مع التمرير | cancelsTouchesInView = delayed | onInterceptTouchEvent + LongPress |
إمكانية الوصول: ليس كل المستخدمين قادرين على تنفيذ ضغط مطول (أشخاص ذوو إعاقات حركية، مستخدمون كبار السن). وفر دائماً طريقة بديلة للوصول إلى إجراءات Long Press — مثلاً، عبر زر "المزيد" في الواجهة أو عبر ميزات إمكانية الوصول في النظام (VoiceOver في iOS، TalkBack في Android). في iOS، يمكنك إضافة Custom Actions عبر UIAccessibilityCustomAction، المتاحة من خلال عجلة VoiceOver.
الأسئلة الشائعة
المدة القياسية لـ Long Press هي 0.5 ثانية (500 مللي ثانية) على كلا المنصتين. يسمح iOS بتكوين minimumPressDuration من 0.3 إلى 1.0 ثانية. يستخدم Android مهلة ثابتة مقدارها 500 مللي ثانية لـ View.setOnLongClickListener. للمستخدمين ذوي المهارات الحركية المحدودة، يُوصى بزيادة المهلة إلى 0.8–1.0 ثانية.
Long Press يُتعرف عليه بمدة الإمساك (0.5 ثانية)، 3D Touch — بقوة الضغط (جرامات القوة). 3D Touch متاح فقط على iPhone 6S–XR (تقنية Force Touch المادية). بدءاً من iOS 13، استبدلت Apple 3D Touch بـ Haptic Touch — محاكاة برمجية تعمل عبر Long Press مع تغذية راجعة لمسية. Haptic Touch متاح على جميع أجهزة iPhone وiPad الحديثة.
تعارض Long Press والتمرير مشكلة شائعة. الحل: عيّن delaysTouchesBegan = true لمعرف الإيماءة في iOS (النظام لا يرسل touchesBegan فوراً، بل ينتظر التعرف على الإيماءة). في Android، استخدم onInterceptTouchEvent الذي يرجع false لـ Long Press. إذا بدأ المستخدم تحريك الإصبع قبل المهلة، تُلغى الإيماءة لصالح التمرير.
نعم، Long Press مدعوم في تطبيقات الويب عبر حدث touchstart/touchend مع قياس الوقت. المتصفحات الحديثة تدعم أيضاً حدث contextmenu الذي يُطلق عند الضغط المطول على الأجهزة المحمولة. للتوافق عبر المتصفحات، استخدم مكتبات مثل hammer.js أو نفذ معرفاً مخصصاً عبر setInterval في معالج touchstart.
في iOS، تُضاف التغذية الراجعة اللمسية عبر UIImpactFeedbackGenerator. استدعِ impactOccurred() في لحظة انتقال UILongPressGestureRecognizer إلى الحالة began. لاستجابة خفيفة، استخدم UIImpactFeedbackGenerator(style: .light). لاستجابة أكثر وضوحاً — .medium. للقوائم السياقية، يضيف iOS تلقائياً تغذية راجعة لمسية عبر UIContextMenuInteraction بدون كود إضافي.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.