الفرق بين المراجعتين لصفحة: «ReactNative/scrollview»

من موسوعة حسوب
لا ملخص تعديل
طلا ملخص تعديل
 
(24 مراجعة متوسطة بواسطة 3 مستخدمين غير معروضة)
سطر 1: سطر 1:
<nowiki>#</nowiki> ScrollView
<noinclude>{{DISPLAYTITLE:المكون ScrollView في ReactNative}}</noinclude>
مكوّن يغلّف المنصة <code>ScrollView</code> لتأمين التكامل مع منظومة مستجيب قفل اللمس (touch locking)، حيث يعمل عندما يكون ارتفاع مكوّن واجهة التمرير <code>ScrollView</code> محدّدًا (bounded)، نظرًا لكونه سيضم أبناءً غير محددي الارتفاع إلى حاوية محدّدة الارتفاع عبر تفاعل التمرير، يمكن تحديد ارتفاع مكون واجهة التمرير بضبط ارتفاعه مباشرةً (وهو خيار غير مستحسنٍ)، أو بالتأكد من وجود ارتفاع محدّد لجميع الواجهات الآباء، ويؤدي نسيان تحويل <code>{flex: 1}</code> أسفل مكدس الواجهة إلى حدوث أخطاءٍ يسارع مراقب العناصر إلى تصحيحها (debug).


   
لا يدعم هذا المكوّن حتى الآن المستجيبات المضمّنة الأخرى والتي تمنع جعل واجهة التمرير الحالية هي المستجيب.


هو عبارة عن مكوّن يغلّف المنصة ScrollView لتأمين التكامل مع منظومة مستجيب "responder" تعليق اللمس (touch locking).
متى يُستخدم المكوّن <code>[[ReactNative/flatlist|FlatList]]</code> بدل المكوّن <code>ScrollView</code>؟


يجب أن يكون ارتفاع المكوّن ScrollView محددًا (bounded) لكي يعمل, كونه سيضم مكونات أبناء غير محددة الارتفاع إلى حاوية محددة الارتفاع أثناء التمرير (scroll). وذلك بضبط ارتفاع العرض مباشرة بالخيار discouraged أو بالتأكد من أنه لجميع العروض الآباء ارتفاع محدد. يؤدي نسيان ضبط الالتفاف أسفل العرض على القيمة `{flex: 1}` إلى حدوث خطأ, يسارع مراقب (inspector) العناصر إلى تصحيحه (debug).
يصيّر مكوّن واجهة التمرير <code>ScrollView</code> جميع مكونات [[React|react]] الأبناء دفعةً واحدةً، مما يؤثر سلبًا على الأداء، فمثلًا عند عرض قوائم طويلة تمتد على عدة صفحات محتوى، فسيبطئ إنشاء الكثير من مكونات JS -والواجهات الأصيلة (native) التي ستظهر دفعةً واحدةً- عملية التصيير ويستهلك الكثير من الذاكرة، وفي هذه الحالة يفضَّل استخدام المكوّن <code>FlatList</code> الذي لا يصير المكوّنات إلا عندما يقترب وقت ظهورها، كما يقوم بإزالتها عند الانتهاء من عرضها على الشاشة مما يوفر قدرة المعالجة والذاكرة المستخدمة، كما يُستخدم هذا المكوّن عند الحاجة لتصيير فاصلٍ بين العناصر أو بين الأعمدة المتعددة، أو تحميل التمرير اللانهائيّ وغيرها من الميزات غير المتوافرة في غيره.


لا يدعم هذا المكوّن حتى الآن المستجيبات المضمّنة الأخرى لتعلّق عرض التمرير الحالي.
__toc__
 
== مثال ==
<nowiki>**</nowiki>متى يُستخدم المكوّن [`FlatList`](<nowiki>https://reactnative.dev/docs/flatlist</nowiki>) بدل المكوّن `<ScrollView>`:**
إليك المثال التالي ([https://snack.expo.dev/@hsoubwiki/scrollview تجربة حية]):<syntaxhighlight lang="javascript">import React from 'react';
 
import { StyleSheet, Text, SafeAreaView, ScrollView, StatusBar } from 'react-native';
يعرض المكوّن `ScrollView` جميع مكونات react الأبناء دفعة واحدة, مما يؤثر سلبًا على الأداء عند عرض القوائم الطويلة التي تتطلب إنشاء الكثير من مكونات JS والعروض الأصيلة (native) ليتم إظهارها دفعة واحدة, وهذا بدوره يبطئ عملية الإظهار ويستهلك الكثير من الذاكرة.
 
في هذه الحالة يفضَّل استخدام المكون `FlatList` الذي لا يعرض المكونات المراد إظهارها إلا عند الوصول إليها, كما يقوم بإزالتها عند الانتهاء منها مما يوفر من قدرة المعالجة والذاكرة المستخدمة. كما يُستخدم هذا المكوّن عند الحاجة لإظهار فاصل بين العناصر أو بين الأعمدة المتعددة, أو لتمرير القوائم متناهية الطول وغيرها من الميزات الغير متوفرة في `ScrollView`.    
 
<nowiki>##</nowiki> مثال
 
```javascript
 
import React from 'react';
 
import { StyleSheet, Text, SafeAreaView, ScrollView } from 'react-native';
 
import Constants from 'expo-constants';


const App = () => {
const App = () => {
 
  return (
  return (
    <SafeAreaView style={styles.container}>
 
      <ScrollView style={styles.scrollView}>
   <SafeAreaView style={styles.container}>
        <Text style={styles.text}>
 
          Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
     <ScrollView style={styles.scrollView}>
          eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
 
          minim veniam, quis nostrud exercitation ullamco laboris nisi ut
       <Text style={styles.text}>
          aliquip ex ea commodo consequat. Duis aute irure dolor in
 
          reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
         Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
          pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
 
          culpa qui officia deserunt mollit anim id est laborum.
         eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
        </Text>
 
      </ScrollView>
         minim veniam, quis nostrud exercitation ullamco laboris nisi ut
    </SafeAreaView>
 
  );
         aliquip ex ea commodo consequat. Duis aute irure dolor in
 
         reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
 
         pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
 
         culpa qui officia deserunt mollit anim id est laborum.
 
       </Text>
 
     </ScrollView>
 
   </SafeAreaView>
 
  );
 
}
}


const styles = StyleSheet.create({
const styles = StyleSheet.create({
 
  container: {
  container: {
    flex: 1,
 
    paddingTop: StatusBar.currentHeight,
   flex: 1,
  },
 
  scrollView: {
   marginTop: Constants.statusBarHeight,
    backgroundColor: 'pink',
 
    marginHorizontal: 20,
  },
  },
 
  text: {
  scrollView: {
    fontSize: 42,
 
  },
   backgroundColor: 'pink',
 
   marginHorizontal: 20,
 
  },
 
  text: {
 
   fontSize: 42,
 
  },
 
});
});


export default App;
export default App;</syntaxhighlight>
 
== الخاصيات  ==
```
 
<nowiki>##</nowiki> الخاصيّات (Props)


موروثة من الخاصيّات [`View Props`](<nowiki>https://reactnative.dev/docs/view#props</nowiki>).
موروثة من الخاصيّات <code>[[ReactNative/view|View]]</code>.


<nowiki>###</nowiki> `alwaysBounceHorizontal`
=== <code>StickyHeaderComponent</code> ===
مكون React سيستخدم لتصيير ترويسات مثبة (sticky headers) ويجب أن يستخدم مع <code>stickyHeaderIndices</code>، وستحتاج إلى تعيين هذ المكون إذا كانت الترويسة المثبتة تستعمل تحويلات مخصصة مثل أن تريد أن تملك قائمةً تحريكات مخصصة مع ترويسة قابلة للاختفاء. إن لم يعطى هذا المكون، فسيُستعمَل المكون <code>[https://github.com/facebook/react-native/blob/master/Libraries/Components/ScrollView/ScrollViewStickyHeader.js ScrollViewStickyHeader]</code> بدلًا منه افتراضيًا.
{| class="wikitable"
! النوع
|-
| مكون، عنصر
|}


قيمتها الافتراضية `horizontal={true}` حيث تجعل عرض التمرير يرتد (bounce) أفقيًا عند وصوله للنهاية حتى ولو كان المحتوى أصغر من عرض التمرير نفسه.
=== <code>alwaysBounceHorizontal</code>  ===


|       النوع        | مطلوب | المنصة |
تجعل واجهة التمرير ترتدّ (bounce) أفقيًا عند وصولها للنهاية حتى ولو كان المحتوى أصغر من واجهة التمرير نفسها، قيمتها الافتراضية <code>true</code> عندما تكون قيمة <code>{horizontal={true</code> وإلا فستكون <code>false</code>.


| :----------------: | :---: | :----: |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| iOS
|}


| قيمة منطقية (bool) |   لا   |  iOS   |
=== <code>alwaysBounceVertical</code>  ===


<nowiki>###</nowiki> `alwaysBounceVertical`
تجعل واجهة التمرير ترتدّ (bounce) عموديًا عند وصولها للنهاية حتى ولو كان المحتوى أصغر من واجهة التمرير نفسها، قيمتها الافتراضية <code>false</code> عندما تكون قيمة <code>{horizontal={true</code> وإلا فستكون <code>true</code>.


قيمتها الافتراضية `vertical={true}` حيث تجعل عرض التمرير يرتد (bounce) عموديًا عند وصوله للنهاية حتى ولو كان المحتوى أصغر من عرض التمرير نفسه.
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| iOS
|}


|       النوع        | مطلوب | المنصة |
=== <code>automaticallyAdjustContentInset</code>  ===


| :----------------: | :---: | :----: |
تتحكّم في ضبط iOS التلقائي للمحتوى المنشأ لواجهات التمرير المتواجدة خلف شريط التنقل أو شريط الأدوات، وقيمتها الافتراضية <code>true</code>.


| قيمة منطقية (bool) |   لا   |  iOS   |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| iOS
|}


<nowiki>###</nowiki> `automaticallyAdjustContentInset`
=== <code>bounces</code> ===


تجعل منصّة iOS تتحكم آليًا بإدخال (inset) المحتوى من أجل عروض التمرير المتواجدة خلف شريط التنقل أو شريط الأدوات. وقيمتها الافتراضية `true`.
تجعل واجهة التمرير يرتد عند وصوله لنهاية المحتوى إن كان أكبر من واجهة التمرير وفق محور اتجاه التمرير عندما تكون قيمتها <code>true</code>، وستلغي جميع أنواع الارتداد حتى لو كانت الخاصيات <code>*alwaysBounce</code> مفعّلة إذا كانت قيمتها <code>false</code>، وقيمتها الافتراضية <code>true</code>.


|       النوع        | مطلوب | المنصة |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| iOS
|}


| :----------------: | :---: | :----: |
=== <code>bouncesZoom</code>  ===


| قيمة منطقية (bool) |   لا   |  iOS   |
تتيح استخدام الإيماءات (gestures) لتجاوز الحد الأدنى والأعلى للتكبير عندما تكون قيمتها <code>true</code>، ويعود التكبير إلى حدوده العليا والصغرى بعد انتهاء الإيماءة، وإلا فلن يتجاوز التكبير الحدود


<nowiki>###</nowiki> `bounces`
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| iOS
|}


قيمتها الافتراضية `true` حيث تجعل عرض التمرير يرتد عند وصوله لنهاية  المحتوى إن كان أكبر من عرض التمرير وفق محور التمرير. أما في حال كانت قيمتها `false` فإنها تلغي جميع أنواع الارتداد حتى لو كانت الخاصيات `alwaysBounce*` مفعّلة.
=== <code>canCancelContentTouches</code>  ===


|       النوع        | مطلوب | المنصة |
تمنع اللمسة المتحركة من السحب (drag) عندما تكون قيمتها <code>true</code>، وهي القيمة الافتراضية.


| :----------------: | :---: | :----: |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| iOS
|}


| قيمة منطقية (bool) |   لا   |  iOS   |
=== <code>centerContent</code>  ===


<nowiki>###</nowiki> `bouncesZoom`
تضع المحتوى آليًا في منتصف واجهة التمرير إذا كان المحتوى أصغر من حدود واجهة التمرير إذا كانت قيمتها <code>true</code>، أما إن كان المحتوى أكبر من واجهة التمرير فلا تأثير لهذه الخاصيّة، وقيمتها الافتراضية هي <code>false</code>.


قيمتها الافتراضية `true` حيث تتيح استخدام الإيماءات (gestures) لتجاوز الحد الأدنى والأقصى للتكبير, ويعود التكبير إلى حدوده الافتراضية بعد انتهاء الإيماءة.
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| iOS
|}


|       النوع        | مطلوب | المنصة |
=== <code>contentContainerStyle</code> ===


| :----------------: | :---: | :----: |
وهي مجموعة من التنسيقات المطبّقة على محتوى واجهة التمرير، والتي تغلّف جميع واجهات المكونات الأبناء.


| قيمة منطقية (bool) |   لا   |  iOS   |
مثال:
 
<nowiki>###</nowiki> `canCancelContentTouches`
 
إذا كانت قيمتها `false` فإنها تمنع اللمسة المتحركة من السحب (drag). وقيمتها الافتراضية `true`.
 
|       النوع        | مطلوب | المنصة |
 
| :----------------: | :---: | :----: |
 
| قيمة منطقية (bool) |   لا   |  iOS   |
 
<nowiki>###</nowiki> `centerContent`
 
إذا كانت قيمتها `true` فإنها تضع المحتوى آليًا في منتصف عرض التمرير إن كان المحتوى أصغر من حدود عرض التمرير, أما إن كان المحتوى أكبر من عرض التمرير فلا تأثير لهذه الخاصيّة. وقيمتها الافتراضية `false`.
 
|       النوع        | مطلوب | المنصة |
 
| :----------------: | :---: | :----: |
 
| قيمة منطقية (bool) |   لا   |  iOS   |
 
<nowiki>###</nowiki> `contentContainerStyle`
 
وهي مجموعة من التنسيقات المطبّقة على محتوى عرض التمرير, والتي تغلّف جميع عروض المكونات الأبناء.
 
<nowiki>**</nowiki>مثال:**
 
```
 
return (
 
  <ScrollView contentContainerStyle={styles.contentContainer}>
 
  </ScrollView>


<syntaxhighlight class="" lang="javascript">return (
  <ScrollView contentContainerStyle={styles.contentContainer}>
  </ScrollView>
);
);
...
...
const styles = StyleSheet.create({
const styles = StyleSheet.create({
  contentContainer: {
    paddingVertical: 20
  }
});</syntaxhighlight>
{| class="wikitable"
! النوع
! مطلوب
|-
| خاصيات تنسيق الواجهة ([[ReactNative/view style props|View Style props]])
| لا
|}


  contentContainer: {
=== <code>contentInset</code> ===
 
   paddingVertical: 20
 
  }
 
});
 
```
 
|                      النوع                    | مطلوب |
 
| :-------------------------------------------: | :---: |
 
| تنسيقات StyleSheetPropType(View Style props)  |   لا   |
 
<nowiki>###</nowiki> `contentInset`
 
تحدد مقدار دخول المحتوى من حواف عرض التمرير, وقيمتها الافتراضية `{top: 0, left: 0, bottom: 0, right: 0}`.
 
|                            النوع                             | مطلوب | المنصة |
 
| :----------------------------------------------------------: | :---: | :----: |
 
| كائن (object: {top: number, left: number, bottom: number, right: number}) |  لا   |  iOS   |
 
<nowiki>###</nowiki> `contentInsetAdjustmentBehavior`
 
تحدد هذه الخاصيّة طريقة استخدام منطقة الإدخال لتعديل منطقة المحتوى في عرض التمرير. والقيمة الافتراضية لها `never`, ومتوفرة فقط على منصة iOS إصدار 11 وما فوق.
 
|                            النوع                             | مطلوب | المنصة |
 
| :----------------------------------------------------------: | :---: | :----: |
 
| قيمة اسمية (enum('automatic', 'scrollableAxes', 'never', 'always')) |  لا   |  iOS   |
 
<nowiki>###</nowiki> `contentOffset`
 
تُستخدم لتحديد إزاحة بداية التمرير يدويًا, والقيمة الافتراضية لها `{x: 0, y: 0}`.
 
|     النوع     | مطلوب | المنصة |
 
| :-----------: | :---: | :----: |
 
| PointPropType |   لا   |  iOS   |
 
<nowiki>###</nowiki> `decelerationRate`
 
عبارة عن عدد عشري يحدد معدل تباطؤ التمرير بعد رفع الإصبع عن عرض التمرير, كما يمكن استخدام اختصارات السلاسل النصية `normal` و `fast` والتي تقابل الإعدادات `UIScrollViewDecelerationRateNormal` و `UIScrollViewDecelerationRateFast` على منصة iOS.
 
<nowiki>*</nowiki> `normal` (الافتراضية)- وتوافق القيمة 0.998 على منصّة iOS والقيمة 0.985 على منصّة Android.
 
<nowiki>*</nowiki> `fast` - وتوافق القيمة 0.99 على منصّة iOS والقيمة 0.9 على منصّة Android.
 
|                       النوع                     | مطلوب |
 
| :---------------------------------------------: | :---: |
 
| قيمة اسمية, عدد (enum('fast', 'normal'),number) |   لا   |
 
<nowiki>###</nowiki> `directionalLockEnabled`
 
إذا كانت قيمتها `true` فإنها تسمح بالتمرير فقط وفق الاتجاه العمودي أو الأفقي أثناء السحب. وقيمتها الافتراضية `false`.
 
|       النوع        | مطلوب | المنصة |
 
| :----------------: | :---: | :----: |
 
| قيمة منطقية (bool) |   لا   |  iOS   |


<nowiki>###</nowiki> `disableIntervalMomentum`
تحدد مقدار بعد المحتوى عن حواف واجهة التمرير وقيمتها الافتراضية <code>{top: 0, left: 0, bottom: 0, right: 0}</code>.


إذا كانت قيمتها `true` فإنها توقف عرض التمرير على الدليل (index) التالي (المتعلّق بموقع التمرير عند التحرير) بغض النظر عن سرعة الإيماءة. ويمكن أن تستخدم للتصفّح الأفقي عندما يكون عرض الصفحة أصغر من عرض ScrollView. وقيمتها الافتراضية `false`.
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| كائن {top: number, left: number, bottom: number, right: number}
| لا
| iOS
|}


|       النوع        | مطلوب |
=== <code>contentInsetAdjustmentBehavior</code> ===


| :----------------: | :---: |
تحدد طريقة استخدام منطقة الإدخال لتعديل منطقة المحتوى في واجهة التمرير، والقيمة الافتراضية لها &quot;<code>never</code>&quot;، وهي متوفرة فقط على منصة iOS ذات الإصدار 11 وما بعده.


| قيمة منطقية (bool) |   لا   |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| <code>('automatic', 'scrollableAxes', 'never', 'always')</code>
| لا
| iOS
|}


<nowiki>###</nowiki> `disableScrollViewPanResponder`
=== <code>contentOffset</code> ===


إذا كانت قيمتها `true` فإنها تلغي عمل المكوّن [`PanResponder`](<nowiki>https://wiki.hsoub.com/ReactNative/panresponder</nowiki>) الافتراضي لعرض التمرير, ويُترك التحكم الكامل للّمسات داخل عرض التمرير للمكونات الأبناء. وهذا مفيد عمليًا عندما تكون الخاصيّة `snapToInterval` مفعّلة كونها لا تتبع أنمط اللمسات النموذجية. يجب تجنب هذه الخاصيّة في الاستخدامات الاعتيادية لعرض التمرير من دون الخاصيّة `snapToInterval`, لأنها قد تسبب حدوث لمسات غير متوقعة أثناء التمرير. وقيمتها الافتراضية `false`.  
تُستخدم لتحديد إزاحة بداية التمرير يدويًا، والقيمة الافتراضية لها <code>{x: 0, y: 0}</code>.


|       النوع        | مطلوب |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| PointPropType
| لا
| iOS
|}


| :----------------: | :---: |
=== <code>decelerationRate</code> ===


| قيمة منطقية (bool) |   لا   |
عبارة عن عدد عشري يحدد معدل تباطؤ التمرير بعد رفع الإصبع عن واجهة التمرير، كما يمكن استخدام اختصارات السلاسل النصية <code>normal</code> و<code>fast</code> والتي تقابل الإعدادات <code>UIScrollViewDecelerationRateNormal</code>، و<code>UIScrollViewDecelerationRateFast</code> على منصة iOS.


<nowiki>###</nowiki> `endFillColor`
* <code>'normal'</code> (الافتراضية): وتوافق القيمة 0.998 على منصّة iOS والقيمة 0.985 على منصّة Android.
* <code>'fast'</code>: وتوافق القيمة 0.99 على منصّة iOS والقيمة 0.9 على منصّة Android.


تُستخدم هذه الخاصيّة لملء الفراغ المتبقي في عرض التمرير والذي يحدث أحيانًا نتيجة أخذ عرض التمرير لحيز أكبر من الذي يشغله المحتوى, حيث تسمح هذه الخاصيّة بتجنب إعداد الخلفية. وتعد هذه الخاصيّة من التحسينات المتقدمة والتي لا تُستخدم في الحالات الاعتيادية.  
{| class="wikitable"
! النوع
! مطلوب
|-
| قيمة ('fast', 'normal')  أو عدد number
| لا
|}


|                        النوع                         | مطلوب | المنصة  |
=== <code>directionalLockEnabled</code>  ===


| :--------------------------------------------------: | :---: | :-----: |
تقفل التمرير العمودي أو الأفقي فقط أثناء السحب إذا كانت قيمتها <code>true</code>، وقيمتها الافتراضية <code>false</code>.


| لون ([`color`](https://reactnative.dev/docs/colors)) |  لا   | Android |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| iOS
|}


<nowiki>###</nowiki> `fadingEdgeLength`
=== <code>disableIntervalMomentum</code> ===


تُستخدم لتلاشي (Fade) حواف المحتوى الممرر. فإذا كانت قيمتها أكبر من الصفر, فإن تلاشي الحواف سيكون وفقًا لاتجاه ومكان التمرير الحالي للدلالة فيما إذا كان هنالك مزيدًا من المحتوى لإظهاره.
إذا كانت قيمتها <code>true</code> فستوقف واجهة التمرير على الدليل (index) التالي (المتعلّق بموقع التمرير عند التحرير) بغض النظر عن سرعة الإيماءة، ويمكن استخدامها للتصفّح الأفقي عندما يكون عرض الصفحة أصغر من عرض المكون <code>ScrollView</code>، وقيمتها الافتراضية <code>false</code>.


|    النوع     | مطلوب | القيمة الافتراضية  | المنصة  |
{| class="wikitable"
! النوع
! مطلوب
|-
| (bool)
| لا
|}


| :----------: | :---: | :---------------: | :-----: |
=== <code>disableScrollViewPanResponder</code>  ===


| عدد (number) |   لا   |         0         | Android |
إذا كانت قيمتها <code>true</code> فستلغي عمل المكوّن <code>[[ReactNative/panresponder|PanResponder]]</code> الافتراضيّ لواجهة التمرير، ويُترك التحكم الكامل للّمسات داخل واجهة التمرير للمكونات الأبناء. وهذا مفيد عمليًا عند تفعيل الخاصيّة <code>snapToInterval</code> لأنها لا تتبع أنمط اللمسات النموذجية، ويجب تجنب هذه الخاصيّة في الاستخدامات الاعتيادية لواجهة التمرير من دون الخاصيّة <code>snapToInterval</code>، لأنها قد تسبب حدوث لمسات غير متوقعة أثناء التمرير. وقيمتها الافتراضية <code>false</code>.


<nowiki>###</nowiki> `horizontal`
{| class="wikitable"
! النوع
! مطلوب
|-
| (bool)
| لا
|}


إذا كانت قيمتها `true` فإن المكونات الأبناء لعرض التمرير ستصطف أفقيًا في سطر بدل الاصطفاف عموديًا في عمود, وقيمتها الافتراضية `false`.
=== <code>endFillColor</code>  ===


|       النوع        | مطلوب |
تُستخدم هذه الخاصيّة لملء الفراغ المتبقي في واجهة التمرير - والذي يحدث أحيانًا نتيجة أخذ واجهة التمرير حيزًا أكبر من الذي يشغله المحتوى- بلونٍ، دون الحاجة إلى إعداد الخلفية، وتُعَدّ هذه الخاصيّة من التحسينات المتقدمة والتي لا تُستخدم في الحالات الاعتيادية.


| :----------------: | :---: |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| لون (<code>[[ReactNative/colors|color]]</code>)
| لا
| Android
|}


| قيمة منطقية (bool) |   لا   |
=== <code>fadingEdgeLength</code>  ===


<nowiki>###</nowiki> `indicatorStyle`
تُستخدم لتلاشي (Fade) حواف محتوى التمرير، فإذا كانت قيمتها أكبر من الصفر فستتلاشى الحواف وفقًا لاتجاه ومكان التمرير الحالي، للدلالة فيما إذا كان هنالك مزيد من المحتوى لإظهاره.


تُستخدم لتنسيق مؤشر التمرير, وقيمها:
{| class="wikitable"
! النوع
! مطلوب
! القيمة الافتراضية
! المنصة
|-
| عدد (number)
| لا
| 0
| Android
|}


<nowiki>*</nowiki> `default` (الافتراضية)- نفس `black`.
=== <code>horizontal</code> ===


<nowiki>*</nowiki> `black` - يكون المؤشر أسود ويستخدم مع الخلفيات الفاتحة.  
إذا كانت قيمتها <code>true</code> فستصطفّ المكونات الأبناء لواجهة التمرير أفقيًا في سطر بدل الاصطفاف عموديًا في عمود، وقيمتها الافتراضية <code>false</code>.  


<nowiki>*</nowiki> `white` - يكون المؤشر أبيض ويستخدم مع الخلفيات الداكنة.
{| class="wikitable"
! النوع
! مطلوب
|-
| (bool)
| لا
|}


|                     النوع                      | مطلوب | المنصة |
=== <code>indicatorStyle</code> ===


| :--------------------------------------------: | :---: | :----: |
تُستخدم لتنسيق مؤشر التمرير، وقيمها:


| قيمة اسمية (enum('default', 'black', 'white')) |  لا   |  iOS   |
* <code>'default'</code> (الافتراضية): نفس <code>black</code>.
* <code>'black'</code>: يكون المؤشر أسودًا، ويستخدم مع الخلفيات الفاتحة.
* <code>'white'</code>: يكون المؤشر أبيضًا، ويستخدم مع الخلفيات الداكنة.


<nowiki>###</nowiki> `invertStickyHeaders`
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| ('default', 'black', 'white')
| لا
| iOS
|}


تجعل هذه الخاصيّة الترويسات الدبقة (sticky headers) تلتصق في أسفل عرض التمرير بدل الالتصاق في الأعلى, وعادة ما تُستخدم مع عرض التمرير المقلوب.
=== <code>invertStickyHeaders</code>  ===


|       النوع        | مطلوب |
تثبت هذه الخاصيّة الترويسات المثبتة (sticky headers) أسفل واجهة التمرير بدلًا من أعلاه، وتستخدم عادةً مع واجهة التمرير المقلوبة.


| :----------------: | :---: |
{| class="wikitable"
! النوع
! مطلوب
|-
| (bool)
| لا
|}


| قيمة منطقية (bool) |   لا   |
=== <code>keyboardDismissMode</code> ===


<nowiki>###</nowiki> `keyboardDismissMode`
تُستخدم لإبطال لوحة المفاتيح أثناء السحب، وقيمها كالتالي:


تُستخدم لإبطال لوحة المفاتيح أثناء السحب, وقيمها:
* على المنصات المتعددة (Cross platform) بما فيها iOS:
**<code>'none'</code> (الافتراضية): لا يلغي السحب لوحة المفاتيح.
**<code>'on-drag'</code>: تلغى لوحة المفاتيح عند بدء السحب.


على المنصات المتعددة (Cross platform):
* على منصّة iOS:
**<code>interactive</code>: تلغى لوحة المفاتيح تفاعليًا مع السحب والحركات بالتزامن مع اللمس، وتفعّل بالسحب للأعلى. وهذه الخاصيّة غير مفعّلة على منصّة Android وتبقى كما لو أن قيمتها <code>'none'</code>. طبعًا القيم السابقة تدخل ضمن الحسبان على منصة iOS.


<nowiki>*</nowiki> `none` (الافتراضية)- لا يبطل السحب لوحة المفاتيح.
{| class="wikitable"
! النوع
! مطلوب
|-
| ('none', 'on-drag', 'interactive')
| لا
|}


<nowiki>*</nowiki> `on-drag` - تبطل لوحة المفاتيح عند بدء السحب.
=== <code>keyboardShouldPersistTaps</code> ===


على منصّة iOS:
تحدد بقاء لوحة المفاتيح مرئيّةً بعد النقر (tap)، وقيمها:


<nowiki>*</nowiki> `interactive` - تبطل لوحة المفاتيح تفاعليًا مع السحب والحركات بالتزامن مع اللمس, وتفعّل بالسحب للأعلى. وهذه الخاصيّة غير مفعّلة على منصّة Android وتبقى كما لو أن قيمتها `none`.
* <code>'never'</code> (الافتراضية): تلغى لوحة المفاتيح عند النقر خارج إطار النص المركّز ولوحة المفاتيح قيد التشغيل. ولن تستقبل المكونات الأبناء لواجهة التمرير النقر عند حدوث ذلك.
* <code>'always'</code>: لا تلغى لوحة المفاتيح تلقائيًا، ولن تستقبل واجهة التمرير النقر لكن المكونات الأبناء تستطيع استقباله.
* <code>'handled'</code>: لا تبطل لوحة المفاتيح تلقائيًا عندما تعالج المكونات الأبناء النقر (أو عند استقباله من قبل المكونات الأجداد).  
* <code>false</code> (مهملة): استخدم <code>'never'</code> بدلًا منها.
* <code>true</code> (مهملة): استخدم <code>'always'</code> بدلًا منها.


|                       النوع                     | مطلوب |
{| class="wikitable"
! النوع
! مطلوب
|-
| ('always', 'never', 'handled', 'false', 'true')
| لا
|}


| :---------------------------------------------: | :---: |
=== <code>maintainVisibleContentPosition</code> ===


| قيمة اسمية (enum('none', 'on-drag', 'interactive')) |  لا  |
عند تفعيل هذه الخاصيّة فستضبط واجهة التمرير موقع التمرير بحيث لا يتغير موقع المكوّن الابن الأول والظاهر حاليًا (عند القيمة <code>minIndexForVisible</code> أو ما بعدها)، وهذا مفيد مع القوائم التي تحمّل المحتوى من كلا الاتجاهين كما هو الحال في الدردشة، حيث تمنع هذه الخاصيّة الرسائل الجديدة الواردة من إزاحة موقع التمرير، والقيمة الاعتيادية لهذه الخاصيّة هي 0، غير أنه يمكن استخدام قيم أخرى مثل 1 من أجل تجاهل تحميل المحتوى الذي قد يغيّر موقع التمرير.


<nowiki>###</nowiki> `keyboardShouldPersistTaps`
يمكن استخدام القيمة الاختيارية <code>autoscrollToTopThreshold</code> لتمرير المحتوى تلقائيا للأعلى بعد ضبط موقع التمرير إذا كان المستخدم ضِمن العتبة العليا قبل الضبط، وهذا مفيد في تطبيقات الدردشة من أجل رؤية الرسائل الجديدة الواردة تلقائًّا دون الحاجة للتمرير في حال قام المستخدم بالتمرير بعيدًا عنها.


تحدد فيما إذا كانت لوحة المفاتيح ستبقى ظاهرة بعد النقر (tap), وقيمها:
'''تنبيه 1:''' قد تؤدي إعادة ترتيب عناصر واجهة التمرير مع تمكين هذه الخاصيّة إلى حدوث قفزات مخلة (jumpiness)، ولا توجد نيّة حاليًا لإصلاح هذا الخلل، لذا يجب حاليًا تجنّب إعادة ترتيب محتوى أي مكوّن واجهة تمريرٍ أو قوائم تستخدم هذه الخاصيّة.


<nowiki>*</nowiki> `never` (الافتراضية)- إن النقر خارج إطار النص المركّز ولوحة المفاتيح مرفوعة, يؤدي إلى إبطالها. ولن تستقبل المكونات الأبناء لعرض التمرير النقر عند حدوث ذلك.  
'''تنبيه 2:''' تستخدم هذه الخاصيّة الخاصيتين <code>contentOffset</code> و<code>frame.origin</code> في الشفرة الأصيلة لحساب قدرة الإظهار (visibility)، كما أنه لم تؤخذ التحويلات وتعقيدات الإظهار الأخرى في الاعتبار.


<nowiki>*</nowiki> `always` - لا تبطل لوحة المفاتيح تلقائيًا, ولن يستقبل عرض التمرير النقر لكن المكونات الأبناء تستطيع استقباله.
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| كائن { minIndexForVisible: number, autoscrollToTopThreshold: number }
| لا
| iOS
|}


<nowiki>*</nowiki> `handled` - لا تبطل لوحة المفاتيح تلقائيًا عند معالجة النقر من قبل المكونات الأبناء لعرض التمرير (أو عند استقباله من قبل المكونات الأجداد).
=== <code>maximumZoomScale</code> ===


<nowiki>*</nowiki> `false` (مهملة)- استخدم `never` بدلًا منها.  
تحدد مقياس الرسم (scale) الأعظمي للتكبير. قيمتها الافتراضية <code>1.0</code>.


<nowiki>*</nowiki> `true` (مهملة)- استخدم `always` بدلًا منها.
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| عدد (number)
| لا
| iOS
|}


|                            النوع                             | مطلوب |
=== <code>minimumZoomScale</code> ===


| :----------------------------------------------------------: | :---: |
تحدد مقياس الرسم (scale) الأصغر للتكبير. قيمتها الافتراضية <code>1.0</code>.


| قيمة اسمية (enum('always', 'never', 'handled', false, true)) |  لا   |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| عدد (number)
| لا
| iOS
|}


<nowiki>###</nowiki> `maintainVisibleContentPosition`
=== <code>nestedScrollEnabled</code> ===


عند استخدام هذه الخاصيّة, فإن عرض التمرير يضبط موقع التمرير بحيث لا يتغير موقع المكوّن الابن الأول والظاهر حاليًا (عند القيمة `minIndexForVisible` أو ما بعدها). وهذا مفيد مع القوائم التي تحمّل المحتوى من كلا الاتجاهين كما هو الحال في الدردشة, حيث تمنع هذه الخاصيّة الرسائل الجديدة الواردة من إزاحة موقع التمرير. القيمة الاعتيادية لهذه الخاصيّة هي `0`, غير أنه يمكن استخدام قيم أخرى مثل `1` من أجل تجاهل تحميل المحتوى الذي قد يغيّر موقع التمرير.  
تمكّن التمرير المتداخل (nested)، وهي مدعومةٌ على واجهات منصة Android البرمجية من المستوى 21 وما بعده، ومدعومة افتراضيًا على منصّة iOS.


يمكن استخدام القيمة الاختيارية `autoscrollToTopThreshold` لتمرير المحتوى تلقائيا للأعلى بعد ضبط موقع التمرير في حال كان المستخدم ضِمن العتبة العليا قبل الضبط. وهذا مفيد في تطبيقات الدردشة من أجل رؤية الرسائل الجديدة الواردة بشكل تلقائي دون الحاجة للتمرير في حال قام المستخدم بالتمرير بعيدًا عنها.
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| Android
|}


<nowiki>**</nowiki>تنبيه 1:** قد يؤدي إعادة ترتيب عناصر scrollview مع تمكين هذه الخاصيّة إلى حدوث تقفّز (jumpiness). ولا يوجد نيّة حاليًا لإصلاح هذا الخلل, لذا يجب حاليًا تجنّب إعادة ترتيب محتوى أي مكوّن scrollview أو Lists يستخدم هذه الخاصيّة.
=== <code>onContentSizeChange</code> ===


<nowiki>**</nowiki>تنبيه 2:** تستخدم هذه الخاصيّة الخاصيتين `contentOffset` و `frame.origin` في الشفرة الأصيلة لحساب قدرة الإظهار (visibility). كما أنه لم يؤخذ في الاعتبار التحويلات وتعقيدات الإظهار الأخرى.
تُستدعى عند تغيّر المحتوى الممرر في المكون <code>ScrollView</code>، حيث يمرر لها عرض المحتوى وارتفاعه على شكل معاملين: <code>contentWidth</code> و<code>contentHeight</code>.


|                            النوع                             | مطلوب | المنصة |
صُممت باستخدام المعالج <code>onLayout</code> المرتبط بحاوية المحتوى الذي يظهره <code>ScrollView</code>.


| :----------------------------------------------------------: | :---: | :----: |
{| class="wikitable"
! النوع
! مطلوب
|-
| دالة (function)
| لا
|}


| كائن (object: { minIndexForVisible: number, autoscrollToTopThreshold: number }) |  لا   |  iOS   |
=== <code>onMomentumScrollBegin</code>  ===


<nowiki>###</nowiki> `maximumZoomScale`
تُستدعى عند بدء التمرير الزخم (momentum)، حين يبدأ <code>ScrollView</code> بالانزلاق.


تحدد مقياس الرسم (scale) الأعظمي للتكبير. قيمتها الافتراضية `1`.
{| class="wikitable"
! النوع
! مطلوب
|-
| دالة (function)
| لا
|}


|    النوع     | مطلوب | المنصة |
=== <code>onMomentumScrollEnd</code>  ===


| :----------: | :---: | :----: |
تُستدعى هذه الدالة عند انتهاء التمرير الزخم (حين يتوقف <code>ScrollView</code> عن الانزلاق).


| عدد (number) |   لا   |  iOS   |
{| class="wikitable"
! النوع
! مطلوب
|-
| دالة (function)
| لا
|}


<nowiki>###</nowiki> `minimumZoomScale`
=== <code>onScroll</code> ===


تحدد مقياس الرسم (scale) الأصغري للتكبير. قيمتها الافتراضية `1`.
تُطلق مرة واحدة على الأكثر لكل إطار (frame) أثناء التمرير، ويمكن التحكم بتردد الأحداث عن طريق الخاصيّة <code>scrollEventThrottle</code>، ولهذه الأحداث الشكل التالي (جميع القيم أعداد):


|    النوع     | مطلوب | المنصة |
<syntaxhighlight class="" lang="javascript">{
  nativeEvent: {
    contentInset: {bottom, left, right, top},
    contentOffset: {x, y},
    contentSize: {height, width},
    layoutMeasurement: {height, width},
    zoomScale
  }
}</syntaxhighlight>
{| class="wikitable"
! النوع
! مطلوب
|-
| دالة (function)
| لا
|}


| :----------: | :---: | :----: |
=== <code>onScrollBeginDrag</code>  ===


| عدد (number) |   لا   |  iOS   |
تُستدعى عندما يبدأ المستخدم بسحب واجهة التمرير (scroll view).


<nowiki>###</nowiki> `nestedScrollEnabled`
{| class="wikitable"
! النوع
! مطلوب
|-
| دالة (function)
| لا
|}


تمكّن من التمرير المتداخل (nested), ومدعومة على واجهات منصة Android البرمجية من المستوى 21+. كما أنها مدعومة افتراضيًا على منصّة iOS.
=== <code>onScrollEndDrag</code>  ===


|       النوع        | مطلوب | المنصة  |
تُستدعى عند توقف المستخدم عن سحب واجهة التمرير، وكذلك عندما تتوقف واجهة التمرير أو تبدأ بالانزلاق.


| :----------------: | :---: | :-----: |
{| class="wikitable"
! النوع
! مطلوب
|-
| دالة (function)
| لا
|}


| قيمة منطقية (bool) |   لا   | Android |
=== <code>onScrollToTop</code>  ===


<nowiki>###</nowiki> `onContentSizeChange`
تُطلق عند تمرير واجهة التمرير للأعلى بعد نقر شريط الحالة.


تُستدعى هذه الدالة عند تغيّر المحتوى الممرر في ScrollView, حيث يمرر لهذه الدالة عرض وارتفاع المحتوى على شكل معاملين: `contentWidth` و `contentHeight`.
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| دالة (function)
| لا
| iOS
|}


صُممت هذه الدالة باستخدام المعالج `onLayout` والمرتبط بحاوية المحتوى الذي يظهره ScrollView.
=== <code>overScrollMode</code>  ===


|      النوع      | مطلوب |
تُستخدم لتعديل القيمة الافتراضية لوضع التمرير الإضافي (overScroll)، وقيمها:


| :-------------: | :---: |
* <code>'auto'</code> (الافتراضية): تسمح للمستخدم بالتمرير الإضافي لهذه الواجهة فقط إذا كان كان حجم المحتوى كبيرًا كفايةً لهذا النوع من التمرير.
* <code>'always'</code>: تسمح للمستخدم بالتمرير الإضافي لهذه الواجهة دائمًا.
* <code>'never'</code>: لا تسمح للمستخدم بالتمرير الإضافي لهذه الواجهة.


| دالة (function) |   لا   |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| ('auto', 'always', 'never')
| لا
| Android
|}


<nowiki>###</nowiki> `onMomentumScrollBegin`
=== <code>pagingEnabled</code> ===


تُستدعى هذه الدالة عند بدء زخم (momentum) التمرير (حين يبدأ ScrollView بالانزلاق).
ستتوقف واجهة التمرير عند مضاعفات حجمها فقط عندما تكون قيمة هذه الخاصيّة <code>true</code>، ويمكن استخدامها للتصفح الأفقي، وقيمتها الافتراضية <code>false</code>.


|      النوع      | مطلوب |
'''ملاحظة:''' لا تدعم منصة Android التصفح العموديّ.


| :-------------: | :---: |
{| class="wikitable"
! النوع
! مطلوب
|-
| (bool)
| لا
|}


| دالة (function) |   لا   |
=== <code>persistentScrollbar</code> ===


<nowiki>###</nowiki> `onMomentumScrollEnd`
لا تسمح لأشرطة التمرير بأن تكون شفافة عند عدم استخدامها، وقيمتها الافتراضية <code>false</code>.


تُستدعى هذه الدالة عند انتهاء زخم التمرير(حين يتوقف ScrollView عن الانزلاق).
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| Android
|}


|      النوع      | مطلوب |
=== <code>pinchGestureEnabled</code> ===


| :-------------: | :---: |
تسمح باستخدام إيماءات القَرص (pinch gestures) للتكبير والتصغير في واجهة التمرير عندما تكون قيمتها <code>true</code> (وهي القيمة الافتراضية).


| دالة (function) |   لا   |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| iOS
|}


<nowiki>###</nowiki> `onScroll`
=== <code>refreshControl</code> ===


تُطلق مرة واحدة على الأكثر لكل إطار (frame) أثناء التمرير. ويمكن التحكم بتردد الأحداث عن طريق الخاصيّة `scrollEventThrottle`, ولهذه الأحداث الشكل التالي (جميع القيم أعداد):
يُستخدم لتأمين وظيفة التحديث بالسحب (pull-to-refresh) لواجهة التمرير، ويعمل مع واجهة التمرير العمودية فقط (يجب أن يكون للخاصيّة <code>horizontal</code> القيمة <code>false</code>). ولمزيد من المعلومات حول هذا المكوّن يمكن الإطلاع على <code>[[ReactNative/refreshcontrol|RefreshControl]]</code>.


```
{| class="wikitable"
! النوع
! مطلوب
|-
| عنصر (element)
| لا
|}


{
=== <code>removeClippedSubviews</code> ===


  nativeEvent: {
'''تجريبي:''' تُزال الواجهات الأبناء (التي يكون فيها للخاصيّة <code>overflow</code> القيمة <code>hidden</code>) التي تقع خارج الشاشة من الواجهة الرئيسية (superview) عندما تكون القيمة <code>true</code>، مما يحسّن أداء التمرير في القوائم الطويلة. القيمة الافتراضية <code>false</code>.


   contentInset: {bottom, left, right, top},
{| class="wikitable"
! النوع
! مطلوب
|-
| (bool)
| لا
|}


   contentOffset: {x, y},
===<code>scrollEnabled</code>===


   contentSize: {height, width},
لا يمكن تمرير الواجهة باللمس عندما تكون قيمتها <code>false</code>، والقيمة الافتراضية <code>true</code>.


   layoutMeasurement: {height, width},
'''ملاحظة:''' يمكن تمرير الواجهة دائمًا باستدعاء <code>scrollTo</code>.


   zoomScale
{| class="wikitable"
! النوع
! مطلوب
|-
| (bool)
| لا
|}


  }
=== <code>scrollEventThrottle</code> ===


}
تتحكم بعدد مرات إطلاق أحداث التمرير أثناء التمرير (الفاصل الزمنيّ بالميلي ثانية)، وكلما كانت قيمتها أصغر  زادت دقة الشفرة البرمجية في تعقّب موقع التمرير، غير أن هذا قد يسبب مشاكل في الأداء بسبب كمّ المعلومات المرسل عبر الجسر، ولا يلاحظ الفرق عند تغيير القيم ضمن المجال 1- 16 بسبب تزامن حلقة JS مع معدل تحديث الشاشة، لذا يُفضّل وضع قيمةٍ كبيرةٍ لهذه الخاصيّة عند عدم الحاجة للتعقب الدقيق لتعقب التمرير، وذلك لتقليل كمية المعلومات المرسلة عبر الجسر.


```
القيمة الافتراضية لهذه الخاصيّة هي الصفر 0 والذي يعني إرسال حدث التمرير مرةً واحدةً فقط في كل مرةٍ تمرَّر فيها الواجهة.


|      النوع      | مطلوب |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| عدد (number)
| لا
| iOS
|}


| :-------------: | :---: |
=== <code>scrollIndicatorInsets</code> ===


| دالة (function) |   لا   |
تحدد مقدار دخول مؤشرات واجهة التمرير من أطرافه، و تُضبط قيمتها عادةً بما يماثل قيمة الخاصيّة <code>contentInset</code>، وقيمتها الافتراضية هي <code>{0, 0, 0, 0}</code>.


<nowiki>###</nowiki> `onScrollBeginDrag`
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| ‪ {top: number, left: number, bottom: number, right: number}
| لا
| iOS
|}


تُستدعى هذه الدالة عند بدء المستخدم بسحب عرض التمرير.
=== <code>scrollEventThrottle</code> ===


|      النوع      | مطلوب |
هي وسمٌ (tag) يُستخدم لتسجيل أداء واجهة التمرير الحالي، حيث يشغّل الأحداث الزخمة (يمكن مراجعة sendMomentumEvents)، ليس لهذه الخاصيّة وظيفة أخرى، لذا نحتاج إلى تصميم مُنصتٍ <code>FpsListener</code> أصيلٍ للاستفادة منها.


| :-------------: | :---: |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| سلسلة نصية (string)
| لا
| Android
|}


| دالة (function) |   لا   |
=== <code>scrollToOverflowEnabled</code> ===


<nowiki>###</nowiki> `onScrollEndDrag`
يمكن برمجيًا تمرير واجهة التمرير إلى خارج حدود حجم محتواه عندما تكون قيمتها <code>true</code>، وقيمتها الافتراضية <code>false</code>.


تُستدعى هذه الدالة عند توقف المستخدم عن سحب عرض التمرير, وكذلك عندما يتوقف عرض التمرير أو يبدأ بالانزلاق.
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| iOS
|}


|      النوع      | مطلوب |
=== <code>scrollsToTop</code> ===


| :-------------: | :---: |
يمرَّر واجهة التمرير للأعلى عند نقر شريط الحالة عندما تكون قيمتها <code>true</code>، وهي القيمة الافتراضية.


| دالة (function) |   لا   |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| (bool)
| لا
| iOS
|}


<nowiki>###</nowiki> `onScrollToTop`
===<code>showsHorizontalScrollIndicator</code>===


تُطلق عند تمرير عرض التمرير للأعلى بعد أن نُقر شريط الحالة.
تُظهر مؤشر التمرير الأفقي عندما تكون قيمتها <code>true</code>، وهي قيمتها الافتراضية.


|      النوع      | مطلوب | المنصة |
{| class="wikitable"
! النوع
! مطلوب
|-
| (bool)
| لا
|}


| :-------------: | :---: | :----: |
=== <code>showsVerticalScrollIndicator</code> ===


| دالة (function) |   لا   |  iOS   |
تُظهر مؤشر التمرير العموديّ عندما تكون قيمتها <code>true</code>، وهي قيمتها الافتراضية.


<nowiki>###</nowiki> `overScrollMode`
{| class="wikitable"
! النوع
! مطلوب
|-
| (bool)
| لا
|}


تُستخدم لتعديل القيمة الافتراضية لوضع التمرير الإضافي (overScroll), وقيمها:
=== <code>snapToAlignment</code> ===


<nowiki>*</nowiki> `auto` (الافتراضية)- تسمح للمستخدم بالتمرير الإضافي لهذا العرض فقط في حال كان حجم المحتوى كبير بشكل كافي لهذا النوع من التمرير.
تحدد هذه الخاصيّة علاقة الانجذاب (snapping) إلى واجهة التمرير في حال كانت الخاصيّة <code>snapToInterval</code> مفعّلة، ولها القيم التالية:


<nowiki>*</nowiki> `always` - تسمح دائمًا للمستخدم بالتمرير الإضافي لهذا العرض.  
* <code>'start'</code> (الافتراضية): يكون الانجذاب حذاء اليسار في التمرير الأفقي، وحذاء الأعلى في التمرير العمودي.
* <code>'center'</code>: يكون الانجذاب حذاء المنتصف.
* <code>'end'</code>: يكون الانجذاب حذاء اليمين في التمرير الأفقي، وحذاء الأسفل في التمرير العمودي.


<nowiki>*</nowiki> `never` - لا تسمح للمستخدم بالتمرير الإضافي لهذا العرض.
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| ('start', 'center', 'end')
| لا
| iOS
|}


|                    النوع                     | مطلوب | المنصة  |
=== <code>snapToEnd</code> ===


| :------------------------------------------: | :---: | :-----: |
تعمل بالتعاون مع الخاصيّة <code>snapToOffsets</code>، حيث تعدّ نهاية القائمة إزاحةً للانجذاب عندما تكون قيمتها <code>true</code> (القيمة الافتراضية)، ولتعطيل هذا السلوك يجب ضبطها بالقيمة <code>false</code> للسماح بالتمرير بحريّةٍ بين نهاية القائمة وآخر إزاحةٍ مضبوطةٍ في الخاصيّة <code>snapToOffsets</code>.


| قيمة اسمية (enum('auto', 'always', 'never')) |  لا   | Android |
{| class="wikitable"
! النوع
! مطلوب
|-
| (bool)
| لا
|}


<nowiki>###</nowiki> `pagingEnabled`
=== <code>snapToInterval</code> ===


عندما تكون قيمة هذه الخاصيّة `true` فإن عرض التمرير يتوقف عند مضاعفات حجم عرض التمرير, حيث يمكن استخدام هذه الخاصيّة من أجل التصفح الأفقي. وقيمتها الافتراضية `false`.
تسمح بإيقاف واجهة التمرير على مضاعفات قيمتها، لذا تُستخدم للتصفح عبر المكونات الأبناء التي طولها أصغر من واجهة التمرير، وتُستخدم نموذجيًا مع الخاصيتين <code>snapToAlignment</code> و <code>decelerationRate=&quot;fast&quot;‎</code>، وتلغي الخاصيّة <code>pagingEnabled</code> الأقل قابليةً للضبط.  


<nowiki>**</nowiki>ملاحظة:** التصفح العمودي غير مدعوم على منصة Android.
{| class="wikitable"
! النوع
! مطلوب
|-
| عدد (number)
| لا
|}


|       النوع        | مطلوب |
=== <code>snapToOffsets</code> ===


| :----------------: | :---: |
تعمل هذه الخاصيّة على إيقاف واجهة التمرير على الإزاحات المحددة، لذا تُستخدم للتصفح عبر المكونات الأبناء مختلفة الأحجام والتي طولها أصغر من واجهة التمرير. وتُستخدم نموذجيًا مع الخاصيّة <code>decelerationRate=&quot;fast&quot;‎</code>، وتلغي الخاصيتين <code>pagingEnabled</code> و<code>snapToInterval</code> ذات قابلية الضبط الأقلّ.


| قيمة منطقية (bool) |   لا   |
{| class="wikitable"
! النوع
! مطلوب
|-
| مصفوفة من الأعداد
| لا
|}


<nowiki>###</nowiki> `persistentScrollbar`
=== <code>snapToStart</code> ===


لا تسمح لأشرطة التمرير بأن تعود شفافة بعد الانتهاء منها. وقيمتها الافتراضية `false`.
تعمل بالتعاون مع الخاصيّة <code>snapToOffsets</code>، حيث تعدّ بداية القائمة إزاحةً للانجذاب عندما تكون قيمتها <code>true</code> (القيمة الافتراضية)، ولتعطيل هذا السلوك يجب ضبطها بالقيمة <code>false</code> للسماح بالتمرير بحريّة بين بداية القائمة وأول إزاحةٍ مضبوطةٍ في الخاصيّة <code>snapToOffsets</code>.


|       النوع        | مطلوب | المنصة  |
{| class="wikitable"
! النوع
! مطلوب
|-
| (bool)
| لا
|}


| :----------------: | :---: | :-----: |
=== <code>stickyHeaderIndices</code> ===


| قيمة منطقية (bool) |   لا   | Android |
مصفوفةٌ من أدلة المكونات الأبناء التي ستثبَّت بأعلى الشاشة عند التمرير، حيث يؤدي تمرير القيمة <code>{[stickyHeaderIndices={[0</code> إلى تثبيت الابن الأول في أعلى واجهة التمرير، كما يمكن استخدام الإحداثيات [x,y,z] لتثبيت عدة عناصر عند وصولها لأعلى الشاشة، ولا تعمل هذه الخاصيّة مع الخاصيّة <code>{horizontal={true</code>.


<nowiki>###</nowiki> `pinchGestureEnabled`
{| class="wikitable"
! النوع
! مطلوب
|-
| مصفوفة من الأعداد
| لا
|}


عندما تكون قيمتها `true` (الافتراضية) فإنها تسمح باستخدام إيماءات القَرص (pinch gestures) للتكبير والتصغير في عرض التمرير.
=== <code>zoomScale</code> ===


|       النوع        | مطلوب | المنصة |
تحدد مقياس الرسم لواجهة التمرير الحالية، وقيمتها الافتراضية <code>1.0</code>.


| :----------------: | :---: | :----: |
{| class="wikitable"
! النوع
! مطلوب
! المنصة
|-
| عدد (number)
| لا
| iOS
|}


| قيمة منطقية (bool) |   لا   |  iOS   |
== التوابع  ==


<nowiki>###</nowiki> `refreshControl`
=== <code>()flashScrollIndicators</code> ===
 
يُستخدم هذا المكوّن لتأمين وظيفة التحديث بالسحب (pull-to-refresh) لعرض التمرير, ويعمل مع عرض التمرير العمودي فقط (يجب أن تكون الخاصيّة `horizontal` بالقيمة `false`). ولمزيد من المعلومات حول هذا المكوّن يمكن الإطلاع على [`RefreshControl`](<nowiki>https://reactnative.dev/docs/refreshcontrol</nowiki>).
 
|      النوع     | مطلوب |
 
| :------------: | :---: |
 
| عنصر (element) |   لا   |
 
<nowiki>###</nowiki> `removeClippedSubviews`
 
<nowiki>**</nowiki>تجريبي:** عندما تكون القيمة `true` فإن عروض المكونات الأبناء (التي تكون فيها الخاصيّة `overflow` بالقيمة `hidden`) التي خارج الشاشة, تُزال من العرض الرئيسي (superview), مما يحسّن من أداء التمرير في القوائم الطويلة.
 
|       النوع        | مطلوب |
 
| :----------------: | :---: |
 
| قيمة منطقية (bool) |   لا   |
 
<nowiki>###</nowiki> `scrollBarThumbImage`
 
يمكن بشكل اختياري استخدام صورة كأيقونة لشريط التمرير, وهذا بدوره يلغي اللون عند وجود الصورة, غير أنه يبقى اللون أثناء تحميل الصورة أو عند فشل التحميل. كما يمكن إلغاء اللون أثناء تحميل الصورة بجعل قيمة المعامل `alpha` الخاص باللون مساوية للصفر.
 
<nowiki>*</nowiki> `uri` - سلسلة نصيّة تمثل معرّف مصدر الصورة, والذي هو عبارة عن مسار الملف المحلي للصورة أو اسم مصدر الصورة الثابت (static).  
 
<nowiki>*</nowiki> `number` - نوع مبهم (Opaque) معاد من قبل شيء ما مثل `import IMAGE from'./image.jpg'`.
 
|    النوع     | مطلوب | المنصة |
 
| :----------: | :---: | :----: |
 
| عدد (number) |   لا   |   VR   |
 
<nowiki>###</nowiki> `scrollEnabled`
 
عندما تكون قيمتها `false` فإنه لا يمكن تمرير العرض باللمس. والقيمة الافتراضية `true`.
 
<nowiki>**</nowiki>ملاحظة:** يمكن تمرير العرض دائما باستدعاء `scrollTo`.
 
|       النوع        | مطلوب |
 
| :----------------: | :---: |
 
| قيمة منطقية (bool) |   لا   |
 
<nowiki>###</nowiki> `scrollEventThrottle`
 
تتحكم بعدد مرات إطلاق أحداث التمرير أثناء التمرير (الفاصل الزمني بالميلي ثانية). وكلما كانت قيمتها أصغر كلما زادت دقة الشفرة البرمجية في تعقّب موقع التمرير, غير أن هذا قد يسبب مشاكل في الأداء بسبب كم المعلومات المرسل عبر الجسر, كما أنه لا يلاحظ الفرق عند تغيير القيم ضمن المجال 1- 16  بسبب تزامن حلقة JS مع معدل تحديث الشاشة. لذا يُفضّل عند عدم الحاجة للتعقب الدقيق لتعقب التمرير, وضع قيمة كبيرة لهذه الخاصيّة وذلك للتقليل من كمية المعلومات المرسلة عبر الجسر. إن القيمة الافتراضية لهذه الخاصيّة هي الصفر والذي يعني أن حدث التمرير يُرسل مرة واحدة فقط في كل مرة يمرر فيها العرض.
 
|    النوع     | مطلوب | المنصة |
 
| :----------: | :---: | :----: |
 
| عدد (number) |   لا   |  iOS   |
 
<nowiki>###</nowiki> `scrollIndicatorInsets`
 
تحدد مقدار دخول مؤشرات عرض التمرير من أطرافه, وعادة ما تُضبط قيمة هذه الخاصيّة بشكل مماثل لقيمة الخاصيّة `contentInset`. وقيمتها الافتراضية `{0, 0, 0, 0}`.
 
|                            النوع                             | مطلوب | المنصة |
 
| :----------------------------------------------------------: | :---: | :----: |
 
| كائن (object: {top: number, left: number, bottom: number, right: number}) |  لا   |  iOS   |
 
<nowiki>###</nowiki> `scrollEventThrottle`
 
هي عبارة عن وسم (tag) يُستخدم لتسجيل أداء عرض التمرير الحالي, حيث يشغّل أحداث الزخم (الخاصيّة `sendMomentumEvents`). ليس لهذه الخاصيّة وظيفة أخرى, لذا نحتاج إلى تصميم مُنصت `FpsListener` أصيل للاستفادة من هذه الخاصيّة.
 
|        النوع        | مطلوب | المنصة  |
 
| :-----------------: | :---: | :-----: |
 
| سلسلة نصية (string) |   لا   | Android |
 
<nowiki>###</nowiki> `scrollToOverflowEnabled`
 
عندما تكون قيمتها `true` فإنه يمكن برمجيًا تمرير عرض التمرير إلى خارج حدود حجم محتواه. وقيمته الافتراضية `false`.
 
|       النوع        | مطلوب | المنصة |
 
| :----------------: | :---: | :----: |
 
| قيمة منطقية (bool) |   لا   |  iOS   |
 
<nowiki>###</nowiki> `scrollsToTop`
 
عندما تكون قيمتها `true` فإن عرض التمرير يمرَّر للأعلى عند نقر شريط الحالة. وقيمتها الافتراضية `true`.
 
|       النوع        | مطلوب | المنصة |
 
| :----------------: | :---: | :----: |
 
| قيمة منطقية (bool) |   لا   |  iOS   |
 
<nowiki>###</nowiki> `sendUpdatedChildFrames`
 
<nowiki>**</nowiki>مهملة:** عندما تكون قيمتها `true` فإن عرض التمرير يرسل بيانات `updateChildFrames` في أحداث التمرير. أوجدت لدعم الإصدارات القديمة, وستُستخدم `onLayout` بدلًا منها لجلب بيانات الإطار. وقيمتها الافتراضية `false`.
 
|       النوع        | مطلوب | المنصة |
 
| :----------------: | :---: | :----: |
 
| قيمة منطقية (bool) |   لا   |  iOS   |
 
<nowiki>###</nowiki> `showsHorizontalScrollIndicator`
 
عندما تكون قيمتها `true` فإنها تُظهر مؤشر التمرير الأفقي. وقيمتها الافتراضية `true`.
 
|       النوع        | مطلوب |
 
| :----------------: | :---: |
 
| قيمة منطقية (bool) |   لا   |
 
<nowiki>###</nowiki> `showsVerticalScrollIndicator`
 
عندما تكون قيمتها `true` فإنها تُظهر مؤشر التمرير العمودي. وقيمتها الافتراضية `true`.
 
|       النوع        | مطلوب |
 
| :----------------: | :---: |
 
| قيمة منطقية (bool) |   لا   |
 
<nowiki>###</nowiki> `snapToAlignment`
 
تحدد هذه الخاصيّة علاقة الانجذاب (snapping) بعرض التمرير في حال كانت الخاصيّة `snapToInterval` مفعّلة. ولها القيم التالية:
 
<nowiki>*</nowiki> `start` (الافتراضية)- تحاذي الانجذاب لليسار في التمرير الأفقي, وللأعلى في التمرير العمودي.
 
<nowiki>*</nowiki> `center` - تحاذي الانجذاب للمنتصف.
 
<nowiki>*</nowiki> `end` - تحاذي الانجذاب لليمين في التمرير الأفقي, وللأسفل في التمرير العمودي.
 
|                    النوع                    | مطلوب | المنصة |
 
| :-----------------------------------------: | :---: | :----: |
 
| قيمة اسمية (enum('start', 'center', 'end')) |  لا   |  iOS   |
 
<nowiki>###</nowiki> `snapToEnd`
 
تعمل بالتعاون مع الخاصيّة `snapToOffsets`. حيث تعدّ نهاية القائمة كإزاحة للانجذاب عندما تكون قيمتها `true` (القيمة الافتراضية), ولتعطيل هذا السلوك يجب ضبطها بالقيمة `false` للسماح بالتمرير بحريّة بين نهاية القائمة وآخر إزاحة مضبوطة في الخاصيّة `snapToOffsets`.
 
|       النوع        | مطلوب |
 
| :----------------: | :---: |
 
| قيمة منطقية (bool) |   لا   |
 
<nowiki>###</nowiki> `snapToInterval`
 
تسمح هذه الخاصيّة بإيقاف عرض التمرير على مضاعفات قيمتها, لذا تُستخدم للتصفح عبر المكونات الأبناء التي طولها أصغر من عرض التمرير. وتُستخدم نموذجيًا مع الخاصيتين `snapToAlignment` و `decelerationRate="fast"`, وتلغي الخاصيّة `pagingEnabled` الأقل قابلية للضبط.  
 
|     النوع    | مطلوب |
 
| :----------: | :---: |
 
| عدد (number) |   لا   |
 
<nowiki>###</nowiki> `snapToOffsets`
 
تعمل هذه الخاصيّة على إيقاف عرض التمرير على الإزاحات المحددة, لذا تُستخدم للتصفح عبر المكونات الأبناء مختلفة الأحجام والتي طولها أصغر من عرض التمرير. وتُستخدم نموذجيًا مع الخاصيّة  `decelerationRate="fast"`, وتلغي الخاصيتين `pagingEnabled` و `snapToInterval` الأقل قابلية للضبط.  
 
|              النوع             | مطلوب |
 
| :----------------------------: | :---: |
 
| مصفوفة عددية (array of number) |   لا   |
 
<nowiki>###</nowiki> `snapToStart`
 
تعمل بالتعاون مع الخاصيّة `snapToOffsets`. حيث تعدّ بداية القائمة كإزاحة للانجذاب عندما تكون قيمتها `true` (القيمة الافتراضية), ولتعطيل هذا السلوك يجب ضبطها بالقيمة `false` للسماح بالتمرير بحريّة بين بداية القائمة وأول إزاحة مضبوطة في الخاصيّة `snapToOffsets`.
 
|       النوع        | مطلوب |
 
| :----------------: | :---: |
 
| قيمة منطقية (bool) |   لا   |
 
<nowiki>###</nowiki> `stickyHeaderIndices`
 
عبارة عن مصفوفة من أدلة المكونات الأبناء التي ستثبَّت بأعلى الشاشة عند التمرير, حيث يؤدي تمرير القيمة `stickyHeaderIndices={[0]}` إلى تثبيت الابن الأول بأعلى عرض التمرير. كما يمكن استخدام الإحداثيات `[x,y,z]` لجعل عدة عناصر دبقة (sticky) عند وصولها لأعلى الشاشة. لا تعمل هذه الخاصيّة مع الخاصيّة `horizontal={true}`.  
 
|              النوع             | مطلوب |
 
| :----------------------------: | :---: |
 
| مصفوفة عددية (array of number) |   لا   |
 
<nowiki>###</nowiki> `zoomScale`
 
تحدد مقياس الرسم لعرض التمرير الحالي, وقيمتها الافتراضية `1`.
 
|    النوع     | مطلوب | المنصة |
 
| :----------: | :---: | :----: |
 
| عدد (number) |   لا   |  iOS   |
 
<nowiki>##</nowiki> التوابع (Methods)
 
<nowiki>###</nowiki> `flashScrollIndicators()`
 
```Javascript
 
flashScrollIndicators();
 
```


<syntaxhighlight lang="javascript">flashScrollIndicators();</syntaxhighlight>
يُظهر مؤشرات التمرير لحظيًا.
يُظهر مؤشرات التمرير لحظيًا.


<nowiki>###</nowiki> `scrollTo()`
=== <code>()scrollTo</code> ===
 
```Javascript
 
scrollTo(
 
  options?: {x?: number, y?: number, animated?: boolean} | number,
 
  deprecatedX?: number,
 
   deprecatedAnimated?: boolean,
 
);
 
```
 
يمرر نحو الإزاحة المعطاة (x,y) بحركة سريعة أو سلسة.
 
<nowiki>**</nowiki>مثال:**
 
```
 
scrollTo({x: 0, y: 0, animated: true})
 
```
 
<nowiki>**</nowiki>ملاحظة:** لهذا التابع توقيع (signature) غريب لكونه صُمم لدعم المنصات القديمة, حيث يقبل معاملات منفصلة كبديل عن كائن الخيارات, لذا فإن هذا الكائن مهمل لمنع الالتباس.
 
<nowiki>###</nowiki> `scrollToEnd()`
 
```Javascript
 
scrollToEnd(([options]: { animated: boolean, duration: number }));
 
```
 
يمرر للأسفل في حال كان عرض التمرير عموديًا, ويمرر لليمين في حال كان عرض التمرير أفقيًا. وله الخيار `scrollToEnd({animated: true})` من أجل التمرير السلس وهو الإفتراضي, والخيار `scrollToEnd({animated: false})` من أجل التمرير السريع. كما ويمكن على منصة Android إضافة المدة الزمنية للتمرير `scrollToEnd({duration: 500})`. في حال عدم تمرير أي خيار لهذا لتابع فإن القيمة الافتراضية للخيار `animated` هي `true`.


<nowiki>###</nowiki> `scrollWithoutAnimationTo()`
<syntaxhighlight lang="javascript">scrollTo(
  options?: {x?: number, y?: number, animated?: boolean} | number,
  deprecatedX?: number,
    deprecatedAnimated?: boolean,
);</syntaxhighlight>
يقوم بالتمرير نحو الإزاحة المعطاة (x,y) بحركةٍ سريعةٍ أو سلسةٍ.


```Javascript
مثال:


scrollWithoutAnimationTo(y, x);
<syntaxhighlight class="" lang="javascript">scrollTo({x: 0, y: 0, animated: true})</syntaxhighlight>
'''تنبيه:''' لهذا التابع توقيع (signature) غريبٌ لأنّه صُمم لدعم المنصات القديمة، حيث يقبل معاملاتٍ منفصلةً كبديلٍ عن كائن الخيارات، لذا يهمَل هذا الكائن منعًا للالتباس (مثل قيمة y قبل x) لذا '''لا يجب أن يُستعمَل'''.


```
=== <code>()scrollToEnd</code> ===


<nowiki>**</nowiki>مهمل:** استخدم التابع `scrollTo` بدلا منه.
<syntaxhighlight lang="javascript">scrollToEnd(([options]: { animated: boolean, duration: number }));</syntaxhighlight>
يقوم بالتمرير للأسفل عندما تكون واجهة التمرير عموديةً، ولليمين عندما تكون أفقيةً، وله الخيار <code>({scrollToEnd({animated: true</code> للتمرير السلس وهو الإفتراضي، والخيار <code>{(scrollToEnd({animated: false</code> للتمرير السريع، ويمكن على منصة Android إضافة المدة الزمنية للتمرير <code>({scrollToEnd({duration: 500</code>، وتكون القيمة الافتراضية للخيار <code>animated</code> هي <code>true</code> عند عدم تمرير أي خيار لهذا لتابع.  


<nowiki>##</nowiki> مصادر
== مصادر ==


<nowiki>*</nowiki> [صفحة scrollView  في توثيق React Native الرسمي.](<nowiki>https://facebook.github.io/react-native/docs/scrollview</nowiki>)
* [https://reactnative.dev/docs/scrollview صفحة scrollView في توثيق React Native الرسميّ]
*
[[تصنيف:ReactNative]]
[[تصنيف:React Native Component]]

المراجعة الحالية بتاريخ 14:02، 9 أكتوبر 2021

مكوّن يغلّف المنصة ScrollView لتأمين التكامل مع منظومة مستجيب قفل اللمس (touch locking)، حيث يعمل عندما يكون ارتفاع مكوّن واجهة التمرير ScrollView محدّدًا (bounded)، نظرًا لكونه سيضم أبناءً غير محددي الارتفاع إلى حاوية محدّدة الارتفاع عبر تفاعل التمرير، يمكن تحديد ارتفاع مكون واجهة التمرير بضبط ارتفاعه مباشرةً (وهو خيار غير مستحسنٍ)، أو بالتأكد من وجود ارتفاع محدّد لجميع الواجهات الآباء، ويؤدي نسيان تحويل {flex: 1} أسفل مكدس الواجهة إلى حدوث أخطاءٍ يسارع مراقب العناصر إلى تصحيحها (debug).

لا يدعم هذا المكوّن حتى الآن المستجيبات المضمّنة الأخرى والتي تمنع جعل واجهة التمرير الحالية هي المستجيب.

متى يُستخدم المكوّن FlatList بدل المكوّن ScrollView؟

يصيّر مكوّن واجهة التمرير ScrollView جميع مكونات react الأبناء دفعةً واحدةً، مما يؤثر سلبًا على الأداء، فمثلًا عند عرض قوائم طويلة تمتد على عدة صفحات محتوى، فسيبطئ إنشاء الكثير من مكونات JS -والواجهات الأصيلة (native) التي ستظهر دفعةً واحدةً- عملية التصيير ويستهلك الكثير من الذاكرة، وفي هذه الحالة يفضَّل استخدام المكوّن FlatList الذي لا يصير المكوّنات إلا عندما يقترب وقت ظهورها، كما يقوم بإزالتها عند الانتهاء من عرضها على الشاشة مما يوفر قدرة المعالجة والذاكرة المستخدمة، كما يُستخدم هذا المكوّن عند الحاجة لتصيير فاصلٍ بين العناصر أو بين الأعمدة المتعددة، أو تحميل التمرير اللانهائيّ وغيرها من الميزات غير المتوافرة في غيره.

مثال

إليك المثال التالي (تجربة حية):

import React from 'react';
import { StyleSheet, Text, SafeAreaView, ScrollView, StatusBar } from 'react-native';

const App = () => {
  return (
    <SafeAreaView style={styles.container}>
      <ScrollView style={styles.scrollView}>
        <Text style={styles.text}>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
          eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
          minim veniam, quis nostrud exercitation ullamco laboris nisi ut
          aliquip ex ea commodo consequat. Duis aute irure dolor in
          reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
          pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
          culpa qui officia deserunt mollit anim id est laborum.
        </Text>
      </ScrollView>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: StatusBar.currentHeight,
  },
  scrollView: {
    backgroundColor: 'pink',
    marginHorizontal: 20,
  },
  text: {
    fontSize: 42,
  },
});

export default App;

الخاصيات

موروثة من الخاصيّات View.

StickyHeaderComponent

مكون React سيستخدم لتصيير ترويسات مثبة (sticky headers) ويجب أن يستخدم مع stickyHeaderIndices، وستحتاج إلى تعيين هذ المكون إذا كانت الترويسة المثبتة تستعمل تحويلات مخصصة مثل أن تريد أن تملك قائمةً تحريكات مخصصة مع ترويسة قابلة للاختفاء. إن لم يعطى هذا المكون، فسيُستعمَل المكون ScrollViewStickyHeader بدلًا منه افتراضيًا.

النوع
مكون، عنصر

alwaysBounceHorizontal

تجعل واجهة التمرير ترتدّ (bounce) أفقيًا عند وصولها للنهاية حتى ولو كان المحتوى أصغر من واجهة التمرير نفسها، قيمتها الافتراضية true عندما تكون قيمة {horizontal={true وإلا فستكون false.

النوع مطلوب المنصة
(bool) لا iOS

alwaysBounceVertical

تجعل واجهة التمرير ترتدّ (bounce) عموديًا عند وصولها للنهاية حتى ولو كان المحتوى أصغر من واجهة التمرير نفسها، قيمتها الافتراضية false عندما تكون قيمة {horizontal={true وإلا فستكون true.

النوع مطلوب المنصة
(bool) لا iOS

automaticallyAdjustContentInset

تتحكّم في ضبط iOS التلقائي للمحتوى المنشأ لواجهات التمرير المتواجدة خلف شريط التنقل أو شريط الأدوات، وقيمتها الافتراضية true.

النوع مطلوب المنصة
(bool) لا iOS

bounces

تجعل واجهة التمرير يرتد عند وصوله لنهاية المحتوى إن كان أكبر من واجهة التمرير وفق محور اتجاه التمرير عندما تكون قيمتها true، وستلغي جميع أنواع الارتداد حتى لو كانت الخاصيات *alwaysBounce مفعّلة إذا كانت قيمتها false، وقيمتها الافتراضية true.

النوع مطلوب المنصة
(bool) لا iOS

bouncesZoom

تتيح استخدام الإيماءات (gestures) لتجاوز الحد الأدنى والأعلى للتكبير عندما تكون قيمتها true، ويعود التكبير إلى حدوده العليا والصغرى بعد انتهاء الإيماءة، وإلا فلن يتجاوز التكبير الحدود

النوع مطلوب المنصة
(bool) لا iOS

canCancelContentTouches

تمنع اللمسة المتحركة من السحب (drag) عندما تكون قيمتها true، وهي القيمة الافتراضية.

النوع مطلوب المنصة
(bool) لا iOS

centerContent

تضع المحتوى آليًا في منتصف واجهة التمرير إذا كان المحتوى أصغر من حدود واجهة التمرير إذا كانت قيمتها true، أما إن كان المحتوى أكبر من واجهة التمرير فلا تأثير لهذه الخاصيّة، وقيمتها الافتراضية هي false.

النوع مطلوب المنصة
(bool) لا iOS

contentContainerStyle

وهي مجموعة من التنسيقات المطبّقة على محتوى واجهة التمرير، والتي تغلّف جميع واجهات المكونات الأبناء.

مثال:

return (
  <ScrollView contentContainerStyle={styles.contentContainer}>
  </ScrollView>
);
...
const styles = StyleSheet.create({
  contentContainer: {
    paddingVertical: 20
  }
});
النوع مطلوب
خاصيات تنسيق الواجهة (View Style props) لا

contentInset

تحدد مقدار بعد المحتوى عن حواف واجهة التمرير وقيمتها الافتراضية {top: 0, left: 0, bottom: 0, right: 0}.

النوع مطلوب المنصة
كائن {top: number, left: number, bottom: number, right: number} لا iOS

contentInsetAdjustmentBehavior

تحدد طريقة استخدام منطقة الإدخال لتعديل منطقة المحتوى في واجهة التمرير، والقيمة الافتراضية لها "never"، وهي متوفرة فقط على منصة iOS ذات الإصدار 11 وما بعده.

النوع مطلوب المنصة
('automatic', 'scrollableAxes', 'never', 'always') لا iOS

contentOffset

تُستخدم لتحديد إزاحة بداية التمرير يدويًا، والقيمة الافتراضية لها {x: 0, y: 0}.

النوع مطلوب المنصة
PointPropType لا iOS

decelerationRate

عبارة عن عدد عشري يحدد معدل تباطؤ التمرير بعد رفع الإصبع عن واجهة التمرير، كما يمكن استخدام اختصارات السلاسل النصية normal وfast والتي تقابل الإعدادات UIScrollViewDecelerationRateNormal، وUIScrollViewDecelerationRateFast على منصة iOS.

  • 'normal' (الافتراضية): وتوافق القيمة 0.998 على منصّة iOS والقيمة 0.985 على منصّة Android.
  • 'fast': وتوافق القيمة 0.99 على منصّة iOS والقيمة 0.9 على منصّة Android.
النوع مطلوب
قيمة ('fast', 'normal') أو عدد number لا

directionalLockEnabled

تقفل التمرير العمودي أو الأفقي فقط أثناء السحب إذا كانت قيمتها true، وقيمتها الافتراضية false.

النوع مطلوب المنصة
(bool) لا iOS

disableIntervalMomentum

إذا كانت قيمتها true فستوقف واجهة التمرير على الدليل (index) التالي (المتعلّق بموقع التمرير عند التحرير) بغض النظر عن سرعة الإيماءة، ويمكن استخدامها للتصفّح الأفقي عندما يكون عرض الصفحة أصغر من عرض المكون ScrollView، وقيمتها الافتراضية false.

النوع مطلوب
(bool) لا

disableScrollViewPanResponder

إذا كانت قيمتها true فستلغي عمل المكوّن PanResponder الافتراضيّ لواجهة التمرير، ويُترك التحكم الكامل للّمسات داخل واجهة التمرير للمكونات الأبناء. وهذا مفيد عمليًا عند تفعيل الخاصيّة snapToInterval لأنها لا تتبع أنمط اللمسات النموذجية، ويجب تجنب هذه الخاصيّة في الاستخدامات الاعتيادية لواجهة التمرير من دون الخاصيّة snapToInterval، لأنها قد تسبب حدوث لمسات غير متوقعة أثناء التمرير. وقيمتها الافتراضية false.

النوع مطلوب
(bool) لا

endFillColor

تُستخدم هذه الخاصيّة لملء الفراغ المتبقي في واجهة التمرير - والذي يحدث أحيانًا نتيجة أخذ واجهة التمرير حيزًا أكبر من الذي يشغله المحتوى- بلونٍ، دون الحاجة إلى إعداد الخلفية، وتُعَدّ هذه الخاصيّة من التحسينات المتقدمة والتي لا تُستخدم في الحالات الاعتيادية.

النوع مطلوب المنصة
لون (color) لا Android

fadingEdgeLength

تُستخدم لتلاشي (Fade) حواف محتوى التمرير، فإذا كانت قيمتها أكبر من الصفر فستتلاشى الحواف وفقًا لاتجاه ومكان التمرير الحالي، للدلالة فيما إذا كان هنالك مزيد من المحتوى لإظهاره.

النوع مطلوب القيمة الافتراضية المنصة
عدد (number) لا 0 Android

horizontal

إذا كانت قيمتها true فستصطفّ المكونات الأبناء لواجهة التمرير أفقيًا في سطر بدل الاصطفاف عموديًا في عمود، وقيمتها الافتراضية false.

النوع مطلوب
(bool) لا

indicatorStyle

تُستخدم لتنسيق مؤشر التمرير، وقيمها:

  • 'default' (الافتراضية): نفس black.
  • 'black': يكون المؤشر أسودًا، ويستخدم مع الخلفيات الفاتحة.
  • 'white': يكون المؤشر أبيضًا، ويستخدم مع الخلفيات الداكنة.
النوع مطلوب المنصة
('default', 'black', 'white') لا iOS

invertStickyHeaders

تثبت هذه الخاصيّة الترويسات المثبتة (sticky headers) أسفل واجهة التمرير بدلًا من أعلاه، وتستخدم عادةً مع واجهة التمرير المقلوبة.

النوع مطلوب
(bool) لا

keyboardDismissMode

تُستخدم لإبطال لوحة المفاتيح أثناء السحب، وقيمها كالتالي:

  • على المنصات المتعددة (Cross platform) بما فيها iOS:
    • 'none' (الافتراضية): لا يلغي السحب لوحة المفاتيح.
    • 'on-drag': تلغى لوحة المفاتيح عند بدء السحب.
  • على منصّة iOS:
    • interactive: تلغى لوحة المفاتيح تفاعليًا مع السحب والحركات بالتزامن مع اللمس، وتفعّل بالسحب للأعلى. وهذه الخاصيّة غير مفعّلة على منصّة Android وتبقى كما لو أن قيمتها 'none'. طبعًا القيم السابقة تدخل ضمن الحسبان على منصة iOS.
النوع مطلوب
('none', 'on-drag', 'interactive') لا

keyboardShouldPersistTaps

تحدد بقاء لوحة المفاتيح مرئيّةً بعد النقر (tap)، وقيمها:

  • 'never' (الافتراضية): تلغى لوحة المفاتيح عند النقر خارج إطار النص المركّز ولوحة المفاتيح قيد التشغيل. ولن تستقبل المكونات الأبناء لواجهة التمرير النقر عند حدوث ذلك.
  • 'always': لا تلغى لوحة المفاتيح تلقائيًا، ولن تستقبل واجهة التمرير النقر لكن المكونات الأبناء تستطيع استقباله.
  • 'handled': لا تبطل لوحة المفاتيح تلقائيًا عندما تعالج المكونات الأبناء النقر (أو عند استقباله من قبل المكونات الأجداد).
  • false (مهملة): استخدم 'never' بدلًا منها.
  • true (مهملة): استخدم 'always' بدلًا منها.
النوع مطلوب
('always', 'never', 'handled', 'false', 'true') لا

maintainVisibleContentPosition

عند تفعيل هذه الخاصيّة فستضبط واجهة التمرير موقع التمرير بحيث لا يتغير موقع المكوّن الابن الأول والظاهر حاليًا (عند القيمة minIndexForVisible أو ما بعدها)، وهذا مفيد مع القوائم التي تحمّل المحتوى من كلا الاتجاهين كما هو الحال في الدردشة، حيث تمنع هذه الخاصيّة الرسائل الجديدة الواردة من إزاحة موقع التمرير، والقيمة الاعتيادية لهذه الخاصيّة هي 0، غير أنه يمكن استخدام قيم أخرى مثل 1 من أجل تجاهل تحميل المحتوى الذي قد يغيّر موقع التمرير.

يمكن استخدام القيمة الاختيارية autoscrollToTopThreshold لتمرير المحتوى تلقائيا للأعلى بعد ضبط موقع التمرير إذا كان المستخدم ضِمن العتبة العليا قبل الضبط، وهذا مفيد في تطبيقات الدردشة من أجل رؤية الرسائل الجديدة الواردة تلقائًّا دون الحاجة للتمرير في حال قام المستخدم بالتمرير بعيدًا عنها.

تنبيه 1: قد تؤدي إعادة ترتيب عناصر واجهة التمرير مع تمكين هذه الخاصيّة إلى حدوث قفزات مخلة (jumpiness)، ولا توجد نيّة حاليًا لإصلاح هذا الخلل، لذا يجب حاليًا تجنّب إعادة ترتيب محتوى أي مكوّن واجهة تمريرٍ أو قوائم تستخدم هذه الخاصيّة.

تنبيه 2: تستخدم هذه الخاصيّة الخاصيتين contentOffset وframe.origin في الشفرة الأصيلة لحساب قدرة الإظهار (visibility)، كما أنه لم تؤخذ التحويلات وتعقيدات الإظهار الأخرى في الاعتبار.

النوع مطلوب المنصة
كائن { minIndexForVisible: number, autoscrollToTopThreshold: number } لا iOS

maximumZoomScale

تحدد مقياس الرسم (scale) الأعظمي للتكبير. قيمتها الافتراضية 1.0.

النوع مطلوب المنصة
عدد (number) لا iOS

minimumZoomScale

تحدد مقياس الرسم (scale) الأصغر للتكبير. قيمتها الافتراضية 1.0.

النوع مطلوب المنصة
عدد (number) لا iOS

nestedScrollEnabled

تمكّن التمرير المتداخل (nested)، وهي مدعومةٌ على واجهات منصة Android البرمجية من المستوى 21 وما بعده، ومدعومة افتراضيًا على منصّة iOS.

النوع مطلوب المنصة
(bool) لا Android

onContentSizeChange

تُستدعى عند تغيّر المحتوى الممرر في المكون ScrollView، حيث يمرر لها عرض المحتوى وارتفاعه على شكل معاملين: contentWidth وcontentHeight.

صُممت باستخدام المعالج onLayout المرتبط بحاوية المحتوى الذي يظهره ScrollView.

النوع مطلوب
دالة (function) لا

onMomentumScrollBegin

تُستدعى عند بدء التمرير الزخم (momentum)، حين يبدأ ScrollView بالانزلاق.

النوع مطلوب
دالة (function) لا

onMomentumScrollEnd

تُستدعى هذه الدالة عند انتهاء التمرير الزخم (حين يتوقف ScrollView عن الانزلاق).

النوع مطلوب
دالة (function) لا

onScroll

تُطلق مرة واحدة على الأكثر لكل إطار (frame) أثناء التمرير، ويمكن التحكم بتردد الأحداث عن طريق الخاصيّة scrollEventThrottle، ولهذه الأحداث الشكل التالي (جميع القيم أعداد):

{
  nativeEvent: {
    contentInset: {bottom, left, right, top},
    contentOffset: {x, y},
    contentSize: {height, width},
    layoutMeasurement: {height, width},
    zoomScale
  }
}
النوع مطلوب
دالة (function) لا

onScrollBeginDrag

تُستدعى عندما يبدأ المستخدم بسحب واجهة التمرير (scroll view).

النوع مطلوب
دالة (function) لا

onScrollEndDrag

تُستدعى عند توقف المستخدم عن سحب واجهة التمرير، وكذلك عندما تتوقف واجهة التمرير أو تبدأ بالانزلاق.

النوع مطلوب
دالة (function) لا

onScrollToTop

تُطلق عند تمرير واجهة التمرير للأعلى بعد نقر شريط الحالة.

النوع مطلوب المنصة
دالة (function) لا iOS

overScrollMode

تُستخدم لتعديل القيمة الافتراضية لوضع التمرير الإضافي (overScroll)، وقيمها:

  • 'auto' (الافتراضية): تسمح للمستخدم بالتمرير الإضافي لهذه الواجهة فقط إذا كان كان حجم المحتوى كبيرًا كفايةً لهذا النوع من التمرير.
  • 'always': تسمح للمستخدم بالتمرير الإضافي لهذه الواجهة دائمًا.
  • 'never': لا تسمح للمستخدم بالتمرير الإضافي لهذه الواجهة.
النوع مطلوب المنصة
('auto', 'always', 'never') لا Android

pagingEnabled

ستتوقف واجهة التمرير عند مضاعفات حجمها فقط عندما تكون قيمة هذه الخاصيّة true، ويمكن استخدامها للتصفح الأفقي، وقيمتها الافتراضية false.

ملاحظة: لا تدعم منصة Android التصفح العموديّ.

النوع مطلوب
(bool) لا

persistentScrollbar

لا تسمح لأشرطة التمرير بأن تكون شفافة عند عدم استخدامها، وقيمتها الافتراضية false.

النوع مطلوب المنصة
(bool) لا Android

pinchGestureEnabled

تسمح باستخدام إيماءات القَرص (pinch gestures) للتكبير والتصغير في واجهة التمرير عندما تكون قيمتها true (وهي القيمة الافتراضية).

النوع مطلوب المنصة
(bool) لا iOS

refreshControl

يُستخدم لتأمين وظيفة التحديث بالسحب (pull-to-refresh) لواجهة التمرير، ويعمل مع واجهة التمرير العمودية فقط (يجب أن يكون للخاصيّة horizontal القيمة false). ولمزيد من المعلومات حول هذا المكوّن يمكن الإطلاع على RefreshControl.

النوع مطلوب
عنصر (element) لا

removeClippedSubviews

تجريبي: تُزال الواجهات الأبناء (التي يكون فيها للخاصيّة overflow القيمة hidden) التي تقع خارج الشاشة من الواجهة الرئيسية (superview) عندما تكون القيمة true، مما يحسّن أداء التمرير في القوائم الطويلة. القيمة الافتراضية false.

النوع مطلوب
(bool) لا

scrollEnabled

لا يمكن تمرير الواجهة باللمس عندما تكون قيمتها false، والقيمة الافتراضية true.

ملاحظة: يمكن تمرير الواجهة دائمًا باستدعاء scrollTo.

النوع مطلوب
(bool) لا

scrollEventThrottle

تتحكم بعدد مرات إطلاق أحداث التمرير أثناء التمرير (الفاصل الزمنيّ بالميلي ثانية)، وكلما كانت قيمتها أصغر زادت دقة الشفرة البرمجية في تعقّب موقع التمرير، غير أن هذا قد يسبب مشاكل في الأداء بسبب كمّ المعلومات المرسل عبر الجسر، ولا يلاحظ الفرق عند تغيير القيم ضمن المجال 1- 16 بسبب تزامن حلقة JS مع معدل تحديث الشاشة، لذا يُفضّل وضع قيمةٍ كبيرةٍ لهذه الخاصيّة عند عدم الحاجة للتعقب الدقيق لتعقب التمرير، وذلك لتقليل كمية المعلومات المرسلة عبر الجسر.

القيمة الافتراضية لهذه الخاصيّة هي الصفر 0 والذي يعني إرسال حدث التمرير مرةً واحدةً فقط في كل مرةٍ تمرَّر فيها الواجهة.

النوع مطلوب المنصة
عدد (number) لا iOS

scrollIndicatorInsets

تحدد مقدار دخول مؤشرات واجهة التمرير من أطرافه، و تُضبط قيمتها عادةً بما يماثل قيمة الخاصيّة contentInset، وقيمتها الافتراضية هي {0, 0, 0, 0}.

النوع مطلوب المنصة
‪ {top: number, left: number, bottom: number, right: number} لا iOS

scrollEventThrottle

هي وسمٌ (tag) يُستخدم لتسجيل أداء واجهة التمرير الحالي، حيث يشغّل الأحداث الزخمة (يمكن مراجعة sendMomentumEvents)، ليس لهذه الخاصيّة وظيفة أخرى، لذا نحتاج إلى تصميم مُنصتٍ FpsListener أصيلٍ للاستفادة منها.

النوع مطلوب المنصة
سلسلة نصية (string) لا Android

scrollToOverflowEnabled

يمكن برمجيًا تمرير واجهة التمرير إلى خارج حدود حجم محتواه عندما تكون قيمتها true، وقيمتها الافتراضية false.

النوع مطلوب المنصة
(bool) لا iOS

scrollsToTop

يمرَّر واجهة التمرير للأعلى عند نقر شريط الحالة عندما تكون قيمتها true، وهي القيمة الافتراضية.

النوع مطلوب المنصة
(bool) لا iOS

showsHorizontalScrollIndicator

تُظهر مؤشر التمرير الأفقي عندما تكون قيمتها true، وهي قيمتها الافتراضية.

النوع مطلوب
(bool) لا

showsVerticalScrollIndicator

تُظهر مؤشر التمرير العموديّ عندما تكون قيمتها true، وهي قيمتها الافتراضية.

النوع مطلوب
(bool) لا

snapToAlignment

تحدد هذه الخاصيّة علاقة الانجذاب (snapping) إلى واجهة التمرير في حال كانت الخاصيّة snapToInterval مفعّلة، ولها القيم التالية:

  • 'start' (الافتراضية): يكون الانجذاب حذاء اليسار في التمرير الأفقي، وحذاء الأعلى في التمرير العمودي.
  • 'center': يكون الانجذاب حذاء المنتصف.
  • 'end': يكون الانجذاب حذاء اليمين في التمرير الأفقي، وحذاء الأسفل في التمرير العمودي.
النوع مطلوب المنصة
('start', 'center', 'end') لا iOS

snapToEnd

تعمل بالتعاون مع الخاصيّة snapToOffsets، حيث تعدّ نهاية القائمة إزاحةً للانجذاب عندما تكون قيمتها true (القيمة الافتراضية)، ولتعطيل هذا السلوك يجب ضبطها بالقيمة false للسماح بالتمرير بحريّةٍ بين نهاية القائمة وآخر إزاحةٍ مضبوطةٍ في الخاصيّة snapToOffsets.

النوع مطلوب
(bool) لا

snapToInterval

تسمح بإيقاف واجهة التمرير على مضاعفات قيمتها، لذا تُستخدم للتصفح عبر المكونات الأبناء التي طولها أصغر من واجهة التمرير، وتُستخدم نموذجيًا مع الخاصيتين snapToAlignment و decelerationRate="fast"‎، وتلغي الخاصيّة pagingEnabled الأقل قابليةً للضبط.

النوع مطلوب
عدد (number) لا

snapToOffsets

تعمل هذه الخاصيّة على إيقاف واجهة التمرير على الإزاحات المحددة، لذا تُستخدم للتصفح عبر المكونات الأبناء مختلفة الأحجام والتي طولها أصغر من واجهة التمرير. وتُستخدم نموذجيًا مع الخاصيّة decelerationRate="fast"‎، وتلغي الخاصيتين pagingEnabled وsnapToInterval ذات قابلية الضبط الأقلّ.

النوع مطلوب
مصفوفة من الأعداد لا

snapToStart

تعمل بالتعاون مع الخاصيّة snapToOffsets، حيث تعدّ بداية القائمة إزاحةً للانجذاب عندما تكون قيمتها true (القيمة الافتراضية)، ولتعطيل هذا السلوك يجب ضبطها بالقيمة false للسماح بالتمرير بحريّة بين بداية القائمة وأول إزاحةٍ مضبوطةٍ في الخاصيّة snapToOffsets.

النوع مطلوب
(bool) لا

stickyHeaderIndices

مصفوفةٌ من أدلة المكونات الأبناء التي ستثبَّت بأعلى الشاشة عند التمرير، حيث يؤدي تمرير القيمة {[stickyHeaderIndices={[0 إلى تثبيت الابن الأول في أعلى واجهة التمرير، كما يمكن استخدام الإحداثيات [x,y,z] لتثبيت عدة عناصر عند وصولها لأعلى الشاشة، ولا تعمل هذه الخاصيّة مع الخاصيّة {horizontal={true.

النوع مطلوب
مصفوفة من الأعداد لا

zoomScale

تحدد مقياس الرسم لواجهة التمرير الحالية، وقيمتها الافتراضية 1.0.

النوع مطلوب المنصة
عدد (number) لا iOS

التوابع

()flashScrollIndicators

flashScrollIndicators();

يُظهر مؤشرات التمرير لحظيًا.

()scrollTo

scrollTo(
  options?: {x?: number, y?: number, animated?: boolean} | number,
  deprecatedX?: number,
    deprecatedAnimated?: boolean,
);

يقوم بالتمرير نحو الإزاحة المعطاة (x,y) بحركةٍ سريعةٍ أو سلسةٍ.

مثال:

scrollTo({x: 0, y: 0, animated: true})

تنبيه: لهذا التابع توقيع (signature) غريبٌ لأنّه صُمم لدعم المنصات القديمة، حيث يقبل معاملاتٍ منفصلةً كبديلٍ عن كائن الخيارات، لذا يهمَل هذا الكائن منعًا للالتباس (مثل قيمة y قبل x) لذا لا يجب أن يُستعمَل.

()scrollToEnd

scrollToEnd(([options]: { animated: boolean, duration: number }));

يقوم بالتمرير للأسفل عندما تكون واجهة التمرير عموديةً، ولليمين عندما تكون أفقيةً، وله الخيار ({scrollToEnd({animated: true للتمرير السلس وهو الإفتراضي، والخيار {(scrollToEnd({animated: false للتمرير السريع، ويمكن على منصة Android إضافة المدة الزمنية للتمرير ({scrollToEnd({duration: 500، وتكون القيمة الافتراضية للخيار animated هي true عند عدم تمرير أي خيار لهذا لتابع.

مصادر