Stack навигатор¶
Навигатор Stack обеспечивает переход от одного экрана к другому, при этом каждый новый экран размещается на вершине стека.
По умолчанию стековый навигатор настроен на привычный для iOS и Android внешний вид: новые экраны задвигаются справа на iOS, на Android используется анимация по умолчанию ОС. Однако анимации могут быть настроены в соответствии с вашими потребностями.
Следует помнить, что, хотя @react-navigation/stack
является чрезвычайно настраиваемым, он реализован на JavaScript. Хотя анимация и жесты выполняются нативно, производительность может быть не такой высокой, как у нативной реализации. Для многих приложений это не является проблемой, но если вы испытываете проблемы с производительностью во время навигации, рассмотрите возможность использования вместо него @react-navigation/native-stack
, который использует нативные навигационные примитивы.
Установка¶
Чтобы использовать этот навигатор, убедитесь, что у вас есть @react-navigation/native
и его зависимости (следуйте этому руководству), затем установите @react-navigation/stack
:
1 |
|
Затем необходимо установить и настроить библиотеки, необходимые для работы навигатора стека:
-
Сначала установите
react-native-gesture-handler
.Если у вас есть проект, управляемый Expo, то в каталоге проекта выполните команду:
1
npx expo install react-native-gesture-handler
Если у вас есть "голый" проект React Native, в каталоге проекта выполните команду:
1
npm install react-native-gesture-handler
-
Чтобы завершить установку
react-native-gesture-handler
, добавьте следующее в top (убедитесь, что он находится в самом верху и перед ним нет ничего другого) вашего входного файла, напримерindex.js
илиApp.js
:1
import 'react-native-gesture-handler';
Примечание
Если вы создаете приложение для Android или iOS, не пропускайте этот шаг, иначе оно может упасть в производстве, даже если в разработке оно работает нормально. Это не относится к другим платформам.
-
Дополнительно можно установить
@react-native-masked-view/masked-view
. Это необходимо, если вы хотите использовать анимацию в стиле UIKit для заголовка (HeaderStyleInterpolators.forUIKit
).Если у вас есть проект, управляемый Expo, в каталоге проекта выполните команду:
1
npx expo install @react-native-masked-view/masked-view
Если у вас есть "голый" проект React Native, в каталоге проекта выполните команду:
1
npm install @react-native-masked-view/masked-view
-
Если вы работаете на Mac и разрабатываете под iOS, то для завершения связывания необходимо также установить pods (через Cocoapods).
1
npx pod-install ios
Определение API¶
Чтобы использовать этот навигатор, импортируйте его из @react-navigation/stack
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Props¶
Компонент Stack.Navigator
принимает следующие параметры:
id
¶
Необязательный уникальный идентификатор навигатора. Он может быть использован с помощью navigation.getParent
для ссылки на этот навигатор в дочернем навигаторе.
initialRouteName
¶
Имя маршрута, которое должно отображаться при первой загрузке навигатора.
screenOptions
¶
Параметры по умолчанию, используемые для экранов в навигаторе.
detachInactiveScreens
¶
Булево значение, используемое для указания того, следует ли отделять неактивные экраны от иерархии представлений для экономии памяти. Это обеспечивает интеграцию с react-native-screens. По умолчанию имеет значение true
.
Если необходимо отключить эту оптимизацию для конкретных экранов (например, чтобы экран оставался в поле зрения даже при расфокусировке), можно воспользоваться опцией detachPreviousScreen
.
keyboardHandlingEnabled
¶
Если false
, то клавиатура НЕ будет автоматически отключаться при переходе на новый экран с этого экрана. По умолчанию установлено значение true
.
Параметры¶
Для настройки экранов в навигаторе можно использовать следующие options. Они могут быть указаны в свойствах screenOptions
свойства Stack.navigator
или options
свойства Stack.Screen
.
title
¶
Строка, которая может быть использована в качестве запасного варианта для headerTitle
.
cardShadowEnabled
¶
Используйте этот параметр для получения видимых теней во время переходов. По умолчанию имеет значение true
.
cardOverlayEnabled
¶
Используйте этот параметр, чтобы во время переходов под картой была видна полупрозрачная темная накладка. По умолчанию имеет значение true
для Android и false
для iOS.
cardOverlay
¶
Функция возвращает React-элемент для отображения в качестве наложения на карточку. При использовании этой функции обязательно установите значение cardOverlayEnabled
в true
.
cardStyle
¶
Объект стиля для карточки в стопке. Здесь можно указать пользовательский цвет фона, который будет использоваться вместо фона по умолчанию.
Также можно указать { backgroundColor: 'transparent' }
, чтобы под ним был виден предыдущий экран (для прозрачных модалов). Это полезно для реализации таких вещей, как модальные диалоги. При использовании прозрачного фона следует также указать в опциях presentation: 'modal'
, чтобы предыдущие экраны не отделялись и оставались видимыми под ними.
В Web высота экрана не ограничивается высотой области просмотра. Это сделано специально для того, чтобы адресная строка браузера могла скрываться при прокрутке. Если такое поведение нежелательно, можно установить cardStyle
в значение { flex: 1 }
, чтобы заставить экран заполнять область просмотра.
presentation
¶
Это опция быстрого доступа, которая позволяет настроить несколько параметров для конфигурирования стиля рендеринга и переходов:
card
: Использовать анимацию ОС по умолчанию для переходов между экранами iOS и Android.modal
: Использовать модальные анимации. Это изменяет несколько параметров:- Устанавливает
headerMode
вscreen
для экрана, если не указано иное. - Изменяет анимацию экрана в соответствии с поведением платформы для модалов.
- Устанавливает
transparentModal
: Аналогиченmodal
. При этом изменяется следующее:- Устанавливает для экрана
headerMode
вscreen
, если не указано иное. - Устанавливает цвет фона экрана прозрачным, чтобы предыдущий экран был виден
- Настраивает опцию
detachPreviousScreen
таким образом, чтобы предыдущий экран оставался отрисованным. - Предотвращает анимацию предыдущего экрана из его последней позиции.
- Изменяет анимацию экрана на вертикальную слайд-анимацию.
- Устанавливает для экрана
Подробнее о настройке transparentModal
см. в разделе Прозрачные модалы.
animationEnabled
¶
Должна ли быть включена анимация перехода на экране. Если установить значение false
, экран не будет анимироваться при нажатии или отталкивании. По умолчанию имеет значение true
для iOS и Android, false
для Web.
animationTypeForReplace
¶
Тип анимации, который будет использоваться, когда этот экран заменяет другой экран. Он принимает следующие значения:
push
- используется анимация выталкивания нового экрана.pop
- используется анимация вываливания экрана.
По умолчанию используется push
.
При использовании pop
к заменяемому экрану применяется анимация pop
.
gestureEnabled
¶
Можно ли использовать жесты для закрытия этого экрана. По умолчанию имеет значение true
для iOS, false
для Android.
Жесты не поддерживаются в Web.
gestureResponseDistance
¶
Число, переопределяющее расстояние начала касания от края экрана для распознавания жестов.
Оно будет задавать горизонтальное или вертикальное расстояние в зависимости от значения gestureDirection
.
По умолчанию используются следующие значения:
50
- когдаgestureDirection
имеет значениеhorizontal
илиhorizontal-inverted
.135
- еслиgestureDirection
имеет значениеvertical
илиvertical-inverted
.
Это не поддерживается в Web.
gestureVelocityImpact
¶
Число, определяющее значимость скорости для жеста. По умолчанию принимается значение 0.3
.
Это значение не поддерживается в Web.
gestureDirection
¶
Направление жестов. Подробности см. в разделе Анимации.
В Web эта функция не поддерживается.
transitionSpec
¶
Объект конфигурации для экранного перехода. Подробности см. в разделе Анимации.
cardStyleInterpolator
¶
Интерполированные стили для различных частей карты. Подробности см. в разделе Анимации.
headerStyleInterpolator
¶
Интерполированные стили для различных частей заголовка. Подробности см. в разделе Анимации.
detachPreviousScreen
¶
Булево значение, указывающее, следует ли отсоединять предыдущий экран от иерархии просмотра для экономии памяти. Установите значение false
, если необходимо, чтобы предыдущий экран был виден через активный экран. Применяется только в том случае, если detachInactiveScreens
не установлено в false
.
Этот параметр автоматически настраивается при использовании presentation
в качестве transparentModal
или modal
для сохранения видимости необходимых экранов. В остальных случаях значение по умолчанию равно true
.
freezeOnBlur
¶
Булево значение, указывающее, следует ли запретить повторное отображение неактивных экранов. По умолчанию имеет значение false
.
По умолчанию принимает значение true
, если enableFreeze()
из пакета react-native-screens
запущен в верхней части приложения.
Требуется версия react-native-screens
>=3.16.0.
Поддерживается только на iOS и Android.
Опции, связанные с заголовками¶
Список опций, связанных с заголовками, можно найти здесь. Эти опции могут быть указаны в свойствах screenOptions
в Stack.navigator
или options
в Stack.Screen
. Для использования этих опций не обязательно использовать непосредственно @react-navigation/elements
, они просто документированы на этой странице.
Кроме них, в стеке также поддерживаются следующие опции:
header
¶
Пользовательский заголовок, используемый вместо заголовка по умолчанию.
Функция принимает функцию, возвращающую React-элемент для отображения в качестве заголовка. В качестве аргумента функция получает объект, содержащий следующие свойства:
navigation
- Объект навигации для текущего экрана.route
- Объект маршрута для текущего экрана.options
- Опции для текущего экрана.layout
- Размеры экрана, содержит свойстваheight
иwidth
.progress
- Анимированные узлы, отображающие ход анимации.back
- Опции для кнопки "Назад", содержит объект со свойствомtitle
для использования в качестве метки кнопки "Назад".styleInterpolator
- Функция, возвращающая интерполированные стили для различных элементов заголовка.
При использовании пользовательского заголовка обязательно установите headerMode
в screen
(подробнее см. ниже).
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Чтобы задать пользовательский заголовок для всех экранов навигатора, можно указать эту опцию в свойстве screenOptions
навигатора.
При использовании пользовательского заголовка следует помнить о двух моментах:
Указывайте "height" в headerStyle
во избежание глюков.¶
Если высота вашего заголовка отличается от высоты заголовка по умолчанию, то возможны глюки, связанные с тем, что измерение происходит несинхронно. Явное указание высоты позволит избежать таких глюков.
Пример:
1 2 3 |
|
Обратите внимание, что по умолчанию этот стиль не применяется к заголовку, поскольку вы сами управляете стилем вашего пользовательского заголовка. Если вы хотите применить этот стиль и к заголовку, используйте headerStyle
из реквизита.
Установите headerMode
в float
для анимации пользовательских заголовков.¶
По умолчанию существует один плавающий заголовок, который отображает заголовки для нескольких экранов на iOS для немодальных устройств. Эти заголовки включают анимацию для плавного перехода друг к другу.
Если вы укажете пользовательский заголовок, React Navigation автоматически изменит его на screen
, чтобы заголовок анимировался вместе с экраном. Это означает, что вам не нужно реализовывать анимацию для его отдельного анимирования.
Однако вы можете захотеть сохранить плавающий заголовок, чтобы иметь другую анимацию перехода между заголовками. Для этого в опциях нужно указать headerMode: 'float'
, а затем интерполировать на реквизиты progress.current
и progress.next
в вашем пользовательском заголовке. Например, в следующем примере заголовок будет перекрестно затухать:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
headerMode
¶
Определяет способ отображения заголовка:
float
- отображение одного заголовка, который остается вверху и анимируется при смене экранов. Этот способ используется по умолчанию в iOS.screen
- к каждому экрану прикрепляется заголовок, и он исчезает вместе с экраном. Этот вариант используется по умолчанию на других платформах.
headerShown
¶
Показывать или скрывать заголовок экрана. По умолчанию заголовок отображается. Установка этого значения в false
скрывает заголовок.
headerBackAllowFontScaling
¶
Должен ли шрифт заголовка кнопки "Назад" масштабироваться с учетом настроек доступности Text Size. По умолчанию имеет значение false
.
headerBackAccessibilityLabel
¶
Метка доступности для кнопки возврата в заголовок.
headerBackImage
¶
Функция, возвращающая React-элемент для отображения пользовательского изображения в кнопке "Назад" заголовка. При использовании функции она получает в качестве аргумента объект tintColor
. По умолчанию используется компонент Image с источником изображения кнопки "Назад", который представляет собой изображение иконки кнопки "Назад", используемое по умолчанию для данной платформы (шеврон на iOS и стрелка на Android).
headerBackTitle
¶
Строка заголовка, используемая кнопкой "Назад" на iOS. По умолчанию используется headerTitle
предыдущей сцены.
headerBackTitleVisible
¶
По умолчанию задается разумное значение того, должен ли заголовок кнопки "Назад" быть видимым или нет, но если вы хотите переопределить его, то можете использовать true
или false
в этой опции.
headerTruncatedBackTitle
¶
Строка заголовка, используемая кнопкой "Назад", когда headerBackTitle
не помещается на экране. По умолчанию "Назад"
.
headerBackTitleStyle
¶
Объект стиля для заднего заголовка.
Events¶
Навигатор может выдавать события на определенные действия. Поддерживаются следующие события:
transitionStart
¶
Это событие вызывается, когда начинается анимация перехода для текущего экрана.
Данные события:
e.data.closing
- Булево значение, указывающее, открыт или закрыт экран.
Пример:
1 2 3 4 5 6 7 8 9 10 |
|
transitionEnd
¶
Это событие вызывается, когда заканчивается анимация перехода для текущего экрана.
Данные события:
e.data.closing
- булево значение, указывающее, был ли экран открыт или закрыт.
Пример:
1 2 3 4 5 6 7 8 9 10 |
|
gestureStart
¶
Это событие вызывается, когда для текущего экрана начинается выполнение жеста пролистывания.
Пример:
1 2 3 4 5 6 7 8 9 10 |
|
gestureEnd
¶
Это событие вызывается, когда жест пролистывания заканчивается для текущего экрана. Например, экран был успешно закрыт.
Пример:
1 2 3 4 5 6 7 8 9 10 |
|
gestureCancel
¶
Это событие вызывается, когда жест пролистывания отменен для текущего экрана. Например, экран не был отменен жестом.
Пример:
1 2 3 4 5 6 7 8 9 10 |
|
Хелперы¶
Навигатор стека добавляет в навигационный реквизит следующие методы:
replace
¶
Заменяет текущий экран на новый экран в стеке. Метод принимает следующие аргументы:
name
- string - Имя маршрута, который необходимо поместить в стек.params
- object - Параметры экрана для передачи маршруту назначения.
1 |
|
push
¶
Помещает новый экран на вершину стека и осуществляет переход к нему. Метод принимает следующие аргументы:
name
- string - Имя маршрута, который необходимо поместить в стек.params
- object - Параметры экрана для передачи маршруту назначения.
1 |
|
pop
¶
Выводит текущий экран из стека и осуществляет переход к предыдущему экрану. Принимает один необязательный аргумент (count
), который позволяет указать, на сколько экранов нужно вернуться назад.
1 |
|
popToTop
¶
Вызывает все экраны в стопке, кроме первого, и осуществляет переход к нему.
1 |
|
Пример¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
Анимации¶
Опции, связанные с анимацией¶
Stack Navigator предоставляет различные опции для настройки анимации перехода при добавлении или удалении экрана. Эти анимации перехода могут быть настроены для каждого экрана путем указания опций в свойстве options
для каждого экрана.
-
gestureDirection
- направление жестов пролистывания:horizontal
- жест закрытия экрана будет начинаться слева, а в RTL - справа. Для анимации экран будет сдвигаться вправо с помощьюSlideFromRightIOS
, а в RTL - влево.horizontal-inverted
- Жест закрытия экрана будет начинаться справа, а в RTL - слева. Для анимации экран будет сдвигаться слева приSlideFromRightIOS
, и справа в RTL, так как направление инвертировано.vertical
- жест закрытия экрана будет начинаться сверху. Для анимации экран будет сдвигаться снизу.vertical-inverted
- Жест закрытия экрана будет начинаться снизу. Для анимации экран будет сдвигаться сверху.
Вместе с
gestureDirection
можно указать и соответствующую горизонтальную/вертикальную анимацию. Для анимаций, включенных в библиотеку, если задать дляgestureDirection
одно из инвертированных значений, то это также перевернет направление анимации. -
transitionSpec
- объект, определяющий тип анимации (timing
илиpring
) и их параметры (например,duration
дляtiming
). Он принимает 2 свойства:open
- Конфигурация перехода при добавлении экранаclose
- конфигурация перехода при удалении экрана.
Каждый из объектов должен задавать 2 свойства:
animation
- Функция анимации, которую следует использовать для анимации. Поддерживаются следующие значения:timing
иpring
.config
- объект конфигурации для функции синхронизации. Дляtiming
это может бытьduration
иeasing
. Дляspring
это могут бытьstiffness
,damping
,mass
,overshootClamping
,restDisplacementThreshold
иrestSpeedThreshold
.
Конфигурация, использующая пружинную анимацию, выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11
const config = { animation: 'spring', config: { stiffness: 1000, damping: 500, mass: 3, overshootClamping: true, restDisplacementThreshold: 0.01, restSpeedThreshold: 0.01, }, };
Мы можем передать эту конфигурацию в опции
transitionSpec
:1 2 3 4 5 6 7 8 9 10
<Stack.Screen name="Profile" component={Profile} options={{ transitionSpec: { open: config, close: config, }, }} />
-
cardStyleInterpolator
- Это функция, задающая интерполированные стили для различных частей карты. Это позволяет настраивать переходы при переходе от экрана к экрану. Ожидается, что она вернет как минимум пустой объект, возможно, содержащий интерполированные стили для контейнера, самой карты, наложения и тени. Поддерживаются следующие свойства:containerStyle
- Стиль для представления контейнера, обертывающего карточку.cardStyle
- стиль представления, представляющего карточку.overlayStyle
- стиль вида, представляющего полупрозрачный оверлей, расположенный нижеshadowStyle
- Стиль представления, представляющего тень карты.
В качестве аргумента функция получает следующие свойства:
current
- Значения для текущего экрана:progress
- Анимированный узел, представляющий значение прогресса на текущем экране.
next
- Значения для экрана, следующего за этим в стеке. Это значение может бытьнеопределенным
в случае, если анимируемый экран является последним.progress
- Анимированный узел, представляющий значение прогресса для следующего экрана.
index
- Индекс карточки в стопке.closing
- Анимированный узел, показывающий, закрывается ли карточка.1
- если закрывается,0
- если нет.layouts
- Размеры макетов для различных элементов, используемых для анимации.screen
- Макет всего экрана. Содержит свойстваheight
иwidth
.
Обратите внимание, что если экран не последний, то он будет использовать конфигурацию перехода следующего экрана. Это связано с тем, что многие переходы включают анимацию предыдущего экрана, и поэтому эти два перехода должны быть вместе, чтобы не запускать два разных вида переходов на двух экранах (например, слайд и модал). Чтобы узнать, нужно ли анимировать предыдущий экран, можно воспользоваться параметром
next
. Подробнее об этом параметре см. в разделе Анимация.Конфигурация, которая просто затухает на экране, выглядит следующим образом:
1 2 3 4 5
const forFade = ({ current }) => ({ cardStyle: { opacity: current.progress, }, });
Мы можем передать эту функцию в опции
cardStyleInterpolator
:1 2 3 4 5
<Stack.Screen name="Profile" component={Profile} options={{ cardStyleInterpolator: forFade }} />
Интерполятор будет вызываться для каждого экрана. Например, в стеке имеется два экрана, A и B. B - это новый экран, попадающий в фокус, а A - предыдущий экран. Интерполятор будет вызываться для каждого экрана:
- Интерполятор вызывается для
B
: Здесь значениеcurrent.progress
представляет собой прогресс перехода, который начнется в0
и закончится в1
. Следующего значенияnext.progress
не будет, посколькуB
является последним экраном. - Интерполятор вызывается для
A
: Здесьcurrent.progress
останется на значении1
и не изменится, так как текущий переход выполняется дляB
, а не дляA
. Значениеnext.progress
представляет собой прогресс дляB
и начнется с0
и закончится на1
.
Допустим, мы хотим анимировать оба экрана во время перехода. Самый простой способ сделать это - объединить значения прогресса текущего и следующего экранов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
const progress = Animated.add( current.progress.interpolate({ inputRange: [0, 1], outputRange: [0, 1], extrapolate: 'clamp', }), next ? next.progress.interpolate({ inputRange: [0, 1], outputRange: [0, 1], extrapolate: 'clamp', }) : 0 );
Здесь на экране
A
будут присутствовать иcurrent.progress
, иnext.progress
, и посколькуcurrent.progress
остается на1
, аnext.progress
меняется, то в совокупности прогресс будет меняться с1
на2
. На экранеB
будет толькоcurrent.progress
, который изменится с0
на1
. Таким образом, мы можем применить различные интерполяции для0-1
и1-2
для анимации сфокусированного и несфокусированного экрана соответственно.Конфигурация, которая переводит предыдущий экран немного влево, а текущий экран переводит от правого края, будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
const forSlide = ({ current, next, inverted, layouts: { screen }, }) => { const progress = Animated.add( current.progress.interpolate({ inputRange: [0, 1], outputRange: [0, 1], extrapolate: 'clamp', }), next ? next.progress.interpolate({ inputRange: [0, 1], outputRange: [0, 1], extrapolate: 'clamp', }) : 0 ); return { cardStyle: { transform: [ { translateX: Animated.multiply( progress.interpolate({ inputRange: [0, 1, 2], outputRange: [ // Focused, but offscreen in the beginning screen.width, 0, // Fully focused screen.width * -0.3, // Fully unfocused ], extrapolate: 'clamp', }), inverted ), }, ], }, }; };
-
headerStyleInterpolator
- Это функция, задающая интерполированные стили для различных частей заголовка. Ожидается, что она вернет как минимум пустой объект, возможно, содержащий интерполированные стили для левого ярлыка и кнопки, правой кнопки, заголовка и фона. Поддерживаются следующие свойства:leftLabelStyle
- Стиль для метки левой кнопки (метка кнопки назад).leftButtonStyle
- Стиль для левой кнопки (обычно это кнопка "Назад").rightButtonStyle
- Стиль для правой кнопки.titleStyle
- Стиль текста заголовка.backgroundStyle
- Стиль фона заголовка.
В качестве аргумента функция получает следующие свойства:
current
- Значения для текущего экрана (экрана, которому принадлежит данный заголовок).progress
- Анимированный узел, представляющий значение прогресса для текущего экрана.0
- когда экран должен начать появляться в поле зрения,0.5
- когда он находится на середине пути,1
- когда он должен быть полностью в поле зрения.
next
- Значение для экрана, следующего за этим в стеке. Это значение может бытьundefined
в случае, если анимируемый экран является последним.progress
- Анимированный узел, представляющий значение прогресса для следующего экрана.
layouts
- Размеры макетов для различных элементов, используемых для анимации. Каждый объект макета содержит свойстваheight
иwidth
.screen
- Макет всего экрана.title
- Макет элемента заголовка. Может бытьнеопределенным
, если заголовок не отрисовывается.leftLabel
- Макет метки кнопки "Назад". Может бытьнеопределенным
, если не отрисовывается ярлык кнопки "Назад".
Конфигурация, в которой элементы просто затухают, выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
const forFade = ({ current, next }) => { const opacity = Animated.add( current.progress, next ? next.progress : 0 ).interpolate({ inputRange: [0, 1, 2], outputRange: [0, 1, 0], }); return { leftButtonStyle: { opacity }, rightButtonStyle: { opacity }, titleStyle: { opacity }, backgroundStyle: { opacity }, }; };
Мы можем передать эту функцию в опции
headerStyleInterpolator
:1 2 3 4 5
<Stack.Screen name="Profile" component={Profile} options={{ headerStyleInterpolator: forFade }} />
Готовые конфигурации¶
С помощью этих опций можно создавать собственные анимации перехода для экранов. Мы также экспортируем различные конфигурации из библиотеки с готовыми анимациями, которые вы можете использовать:
TransitionSpecs
¶
TransitionIOSSpec
- Точные значения из конфигурации анимации UINavigationController.FadeInFromBottomAndroidSpec
- Конфигурация анимации открытия активности из Android Nougat.FadeOutToBottomAndroidSpec
- Конфигурация для анимации закрытия активности из Android Nougat.RevealFromBottomAndroidSpec
- Примерная конфигурация анимации открытия активности из Android Pie.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
CardStyleInterpolators
¶
forHorizontalIOS
- Стандартный заход в iOS-стиле справа.forVerticalIOS
- Стандартный заход снизу в стиле iOS (используется для модалов).forModalPresentationIOS
- Стандартная модальная анимация в стиле iOS в iOS 13.forFadeFromBottomAndroid
- Стандартное затухание снизу в стиле Android для Android Oreo.forRevealFromBottomAndroid
- Стандартное раскрытие снизу в стиле Android для Android Pie.
Пример настройки вертикальной анимации затухания экрана в стиле Android Oreo:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
HeaderStyleInterpolators
¶
forUIKit
- Стандартная анимация в стиле UIKit для заголовка, где заголовок перетекает в метку кнопки "Назад".forFade
- Простая анимация затухания для элементов заголовка.forStatic
- Простая анимация перевода для перевода заголовка вместе с раздвижным экраном.
Пример настройки iOS-анимации по умолчанию для элементов заголовка, где заголовок переходит в кнопку "Назад":
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Чтобы ссылки не менялись при повторном рендеринге, всегда задавайте конфигурацию анимации на верхнем уровне файла. Это важно для плавной и надежной анимации переходов.
TransitionPresets
¶
Мы экспортируем различные пресеты переходов, которые объединяют различные наборы этих опций для соответствия определенным собственным анимациям. Пресет перехода - это объект, содержащий несколько связанных с анимацией экранных опций, экспортируемых в папку TransitionPresets
. В настоящее время доступны следующие пресеты:
SlideFromRightIOS
- стандартный навигационный переход iOS.ModalSlideFromBottomIOS
- стандартный навигационный переход iOS для модалов.ModalPresentationIOS
- стандартный стиль представления модалов в iOS (появился в iOS 13).FadeFromBottomAndroid
- Стандартный навигационный переход Android при открытии или закрытии Activity на Android < 9 (Oreo).RevealFromBottomAndroid
- стандартный навигационный переход Android при открытии или закрытии Activity на Android 9 (Pie).ScaleFromCenterAndroid
- стандартный навигационный переход Android при открытии или закрытии Активности на Android >= 10.DefaultTransition
- Переход навигации по умолчанию для текущей платформы.ModalTransition
- Модальный переход по умолчанию для текущей платформы.
Эти предустановки можно распространить в options
, чтобы настроить анимацию для экрана:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Если необходимо настроить анимацию перехода для всех экранов навигатора, то это можно указать в свойстве screenOptions
для навигатора.
Пример конфигурации для модального стиля представления iOS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Прозрачные модалы¶
Прозрачный модал - это модальный диалог, который перекрывает экран. При этом предыдущий экран остается видимым. Чтобы получить прозрачный модальный экран, в опциях экрана можно указать presentation: 'transparentModal'
.
Пример:
1 2 3 4 5 6 7 8 |
|
Теперь при переходе к экрану Modal
он будет иметь прозрачный фон, а под ним будет виден экран Home
.
В дополнение к presentation
можно дополнительно указать еще несколько параметров, чтобы добиться поведения, похожего на модальный диалог:
- Отключить заголовок с помощью
headerShown: false
. - Включить оверлей с помощью
cardOverlayEnabled: true
(при этом нельзя нажать на оверлей, чтобы закрыть экран, альтернативные варианты см. ниже).
Если вы хотите дополнительно настроить анимацию диалога, закрыть экран при нажатии на оверлей и т.д., то можно использовать хук useCardAnimation
для настройки элементов внутри экрана.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
|
Здесь мы анимируем масштаб диалога, а также добавляем накладку для его закрытия.