التمرير هو آلية لتحريك المحتوى تتيح للمستخدم عرض المعلومات التي تتجاوز حدود شاشة الجهاز المحمول. وفقًا لـ Apple Developer Documentation, 2024، فإن UIScrollView هو العنصر الأساسي لتنفيذ التمرير على iOS. في Android، يؤدي RecyclerView دورًا مشابهًا، حيث يعالج الإيماءات ويدير عرض البيانات. بدون التمرير، كانت الواجهات المحمولة الحديثة مستحيلة: خلاصات الأخبار وقوائم الاتصالات وصفحات النصوص تستخدمه كل ثانية.
أهم النقاط
التمرير هو آلية تفاعلية لنقل المنطقة المرئية من المحتوى داخل نافذة العرض لجهاز محمول. يمرر المستخدم إصبعه على الشاشة، ويتحرك المحتوى في اتجاه الإيماءة، مما يكشف الأجزاء المخفية من الواجهة. التمرير هو نمط تفاعل أساسي: وفقًا لدراسة Nielsen Norman Group (2023)، يقضي المستخدمون 78% من وقتهم في تطبيقات الجوال في تمرير المحتوى.
في تطوير تطبيقات الجوال، يتم تنفيذ التمرير من خلال مكونات متخصصة — ScrollView على iOS وRecyclerView على Android. لا تقوم هذه المكونات بمعالجة اللمسات فحسب، بل تدير أيضًا إعادة استخدام العناصر والرسوم المتحركة والقصور الذاتي. يكفي أن يضع المطور العناصر الفرعية داخل الحاوية، بينما تتولى المنصة آلية التمرير بأكملها.
وفقًا لـ Google I/O 2024، تستخدم تطبيقات التمرير الحديثة تأليف الإيماءات: يحدد النظام اتجاه التمرير وسرعته وتسارع الإصبع، ثم يطبق نموذجًا فيزيائيًا للتباطؤ السلس. يُحسب القصور الذاتي للتمرير بناءً على معامل احتكاك يختلف بين المنصات — يستخدم iOS تسهيلًا تربيعيًا (Quadratic easing)، بينما يستخدم Android استيفاءً قائمًا على الخطوط (Spline-based interpolation).
التمرير الرأسي هو النوع الأكثر شيوعًا من التمرير، ويُستخدم في خلاصات الأخبار وقوائم الدردشة والملفات الشخصية. يتم ترتيب كل المحتوى من الأعلى إلى الأسفل، ويمرر المستخدم لأعلى أو لأسفل للتنقل. التمرير الرأسي بديهي ومدعوم على جميع منصات الجوال بشكل افتراضي.
التمرير الأفقي يُستخدم في الدوارات ومعارض الصور وعلامات التبويب. على iOS، يُستخدم UICollectionView مع تخطيط أفقي؛ وعلى Android، يُستخدم HorizontalScrollView أو RecyclerView مع LinearLayoutManager.HORIZONTAL. يتطلب التمرير الأفقي استخدامًا دقيقًا لأنه يتعارض مع إيماءات النظام «للرجوع» وتبديل التطبيقات.
التمرير اللانهائي هو تقنية لتحميل البيانات مع اقتراب المستخدم من نهاية القائمة. عند عرض العنصر الأخير، يطلب التطبيق تلقائيًا الدفعة التالية من البيانات من الخادم. وفقًا لـ UX Collective (2025)، يزيد التمرير اللانهائي المشاركة بنسبة 40% لتطبيقات المحتوى ولكنه يقلل التحويل للتجارة الإلكترونية بسبب صعوبة التنقل إلى التذييل.
التمرير التباعدي (Parallax) يُحدث تأثير العمق: تتحرك الطبقة الخلفية بشكل أبطأ من الطبقة الأمامية أثناء التمرير. تُستخدم هذه التقنية غالبًا في الصفحات المقصودة والملفات الشخصية للتأثير البصري. يتطلب التنفيذ تراكب عدة طبقات بمعاملات سرعة مختلفة — على iOS يتم ذلك عبر UIScrollViewDelegate وتغيير إزاحة العناصر الخلفية.
على iOS، يتم تنفيذ التمرير من خلال فئة UIScrollView، التي ترث منها UITableView وUICollectionView وUITextView. تعترض UIScrollView اللمسات وتحلل نمط اللمس وتحسب فرق الحركة. إذا قام المستخدم بحركة حادة، يبدأ النظام رسمًا متحركًا بالقصور الذاتي — التباطؤ، والذي يُحسب بالصيغة: velocity * decayFactor ^ t. وفقًا لـ WWDC 2023، تستخدم Apple التباطؤ البارامتري بمعامل 0.998، مما يعطي إحساسًا طبيعيًا بالاحتكاك.
على Android، تتم إدارة التمرير من خلال ViewDragHelper وOverScroller. يتلقى النظام حدث MotionEvent.ACTION_MOVE، ويحسب الإزاحة ويطبقها على scrollY أو scrollX. يُحسب القصور الذاتي بواسطة فئة OverScroller التي تستخدم استيفاء Spline استنادًا إلى نموذج فيزيائي مع احتكاك قابل للتعديل. معامل الاحتكاك الافتراضي هو 0.015 — وكلما زادت القيمة، زادت سرعة توقف التمرير.
الفرق الرئيسي بين المنصات هو تأثير الارتداد. تضيف iOS افتراضيًا تشوهًا مطاطيًا عند التمرير إلى ما بعد حدود المحتوى (bounce)، مما يشير إلى المستخدم بأنه قد وصل إلى النهاية. تطلب Android قبل الإصدار 12 تمكين تأثير التمرير الزائد (overscroll) بشكل صريح، ومع Material Design 3 حصلت على دعم أصلي للتمدد الزائد (stretch-overscroll). تختلف المنصتان أيضًا في معالجة تسلسل التمرير — نقل التمرير من حاوية متداخلة إلى الحاوية الأم عند الوصول إلى الحدود.
| المكون | المنصة | نوع التمرير | المحاكاة الافتراضية | التخطيط |
|---|---|---|---|---|
| UIScrollView | iOS | رأسي / أفقي | لا | حجم المحتوى |
| UICollectionView | iOS | رأسي / أفقي | نعم | UICollectionViewLayout |
| RecyclerView | Android | رأسي / أفقي | نعم | LayoutManager |
| ScrollView (Android) | Android | رأسي | لا | LinearLayout |
| HorizontalScrollView | Android | أفقي | لا | LinearLayout |
UIScrollView هو حاوية أساسية على iOS لا تدعم إعادة استخدام الخلايا. عند إضافة 1000 عنصر، يتم إنشاؤها جميعًا في الذاكرة، مما يشكل مشكلة للأداء. يحل UICollectionView هذه المشكلة من خلال آلية dequeuing — تُعاد استخدام الخلايا المرئية وتُزال الخلايا المخفية من التسلسل الهرمي. وفقًا لـ Apple Engineering (2023)، يوفر UICollectionView مع Compositional Layout ما يصل إلى 50% من FPS بشكل أكثر سلاسة عند العمل مع مجموعات بيانات كبيرة مقارنة بـ UIScrollView.
RecyclerView هو مكون التمرير القياسي على Android الذي يستخدم نمط ViewHolder لإعادة استخدام العناصر. يتمتع RecyclerView ببنية مرنة: يحدد LayoutManager الترتيب (خطي، شبكي، متعرج)، ويدير ItemAnimator الرسوم المتحركة، ويضيف ItemDecoration المسافات والفواصل. وفقًا لـ Android Developer Summit 2024، يمكن لـ RecyclerView مع DiffUtil معالجة تحديثات قائمة تحتوي على 10,000 عنصر في 16 مللي ثانية — في إطار رسوم متحركة واحد.
تُقاس سلاسة التمرير بـ FPS (إطار في الثانية) — الهدف هو 60 إطارًا في الثانية للشاشات العادية و120 إطارًا في الثانية لـ ProMotion. يجب معالجة كل إطار في غضون 16 مللي ثانية (60 FPS) أو 8 مللي ثانية (120 FPS). إذا تسبب التمرير في jank (فقدان الإطارات)، يشعر المستخدم بتأخيرات دقيقة تؤثر سلبًا على إدراك جودة التطبيق. وفقًا لـ Google Android Performance (2024)، يقوم 75% من المستخدمين بحذف التطبيق عند مواجهة تأخيرات منتظمة في التمرير.
الأسباب الرئيسية لتأخيرات التمرير هي layout thrashing والتخصيصات المفرطة. يحدث layout thrashing عندما يقرأ المطور معلمات التخطيط (getWidth, getHeight) بعد تغيير الخصائص، مما يفرض إعادة حساب. كل استدعاء من هذا القبيل يعيد تعيين ذاكرة التخزين المؤقت للتخطيط ويجبر النظام على إعادة تنفيذ Measure وLayout. الحل هو تجميع عمليات القراءة والكتابة: أولاً جميع القياسات، ثم جميع التعديلات.
المحاكاة الافتراضية هي تقنية تحسين رئيسية للقوائم الكبيرة. على iOS، يقوم UICollectionView تلقائيًا بإنشاء خلايا فقط للعناصر المرئية. على Android، يستخدم RecyclerView مجموعة من viewHolders القابلة لإعادة الاستخدام. بالإضافة إلى ذلك، يتم تطبيق التحميل المسبق (prefetching): يقوم النظام بتحميل العناصر بمقدار 1–2 شاشة مقدمًا لتكون الخلايا جاهزة عند التمرير. في Android، يتولى GapWorker هذه المهمة؛ وفي iOS، يتولاها prefetchDataSource.
تتطلب الصور تحسينًا منفصلًا. التحميل في الخلفية مع فك التشفير في مؤشر ترابط منفصل يمنع حظر مؤشر ترابط واجهة المستخدم. توفر المكتبات مثل Glide (Android) وKingfisher (iOS) ذاكرة تخزين مؤقت مدمجة للقرص/الذاكرة، وتحميلًا كسولًا (lazy loading)، وعناصر نائبة أثناء التحميل. وفقًا لمعايير SDWebImage (2024)، يؤدي استخدام التخزين المؤقت للصور إلى تسريع تمرير المعارض بنسبة 60% مقارنة بالتحميل المباشر من الشبكة.
مشكلة شائعة أخرى هي التسلسلات الهرمية الثقيلة للتخطيط. كل عنصر متداخل يزيد من وقت Measure/Layout. العمق الموصى به لا يتجاوز 5 مستويات من التداخل. على Android، يسمح ConstraintLayout بإنشاء تسلسلات هرمية مسطحة، بينما على iOS، تعمل Stack Views وSwiftUI على تحسين التخطيط تلقائيًا. يؤدي استخدام Shadow وCornerRadius على عدد كبير من العناصر أيضًا إلى إبطاء التمرير — يجب تطبيقهما فقط عند الضرورة.
الأسئلة الشائعة
التمرير هو آلية لتمرير المحتوى الذي يتجاوز حجم شاشة الجهاز. يمرر المستخدم إصبعه على الشاشة، ويتحرك المحتوى في اتجاه الإيماءة، مما يكشف الأجزاء المخفية. يتم تنفيذ التمرير من خلال UIScrollView على iOS وRecyclerView على Android.
ScrollView (Android) يقوم بتحميل جميع العناصر الفرعية في الذاكرة مرة واحدة — مع 500 عنصر، يتم إنشاء جميع العناصر الخمسمائة في وقت واحد. يستخدم RecyclerView المحاكاة الافتراضية: ينشئ فقط الخلايا المرئية ويعيد استخدامها أثناء التمرير. للقوائم ذات البيانات الديناميكية، اختر دائمًا RecyclerView.
التمرير اللانهائي هو تقنية يتم فيها تحميل بيانات جديدة تلقائيًا عند الوصول إلى نهاية القائمة الحالية. عندما يقوم المستخدم بالتمرير إلى الحد السفلي، يرسل التطبيق طلبًا إلى API ويضيف عناصر جديدة. يحسن ذلك تجربة المستخدم في الشبكات الاجتماعية وخلاصات المحتوى.
يشمل تحسين التمرير المحاكاة الافتراضية للعناصر من خلال إعادة استخدام الخلايا، والتحميل البطيء للصور مع التخزين المؤقت، والتسلسلات الهرمية المسطحة للتخطيط (لا تزيد عن 5 مستويات)، والتحميل المسبق للبيانات بمقدار 1–2 شاشة، وتجنب layout thrashing. على iOS، استخدم prefetchDataSource؛ على Android، استخدم GapWorker.
القصور الذاتي للتمرير هو تأثير التباطؤ السلس بعد تمريرة حادة بالإصبع. يتذكر النظام سرعة حركة الإصبع ويواصل التمرير مع انخفاض تدريجي في السرعة، محاكيًا الاحتكاك الفيزيائي. يستخدم iOS تسهيلًا تربيعيًا (Quadratic easing)، ويستخدم Android استيفاءً قائمًا على Spline بمعامل احتكاك قدره 0.015.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.