Это видео того, что у меня есть до сих пор https://drive.google.com/file/d/1tJMZfpe8hcqLcNMYiE-6pzwHX0eLofv1/view?usp=sharing
Я пытаюсь исправить "Доступно на 3 месяца", как только contentOffset.y достиг заголовка.Как и в случае с position: sticky
в css.
До сих пор я думал об этом через onScroll
prop в компоненте Scroll View, но проблема в том, что у меня уже есть анимации (Animated.Event)от родительского и дочернего компонента, то есть единственный способ сделать это - использовать функцию listener
в Animated.Event
, но это приведет к супер прерывистой анимации, если для параметра useNativeDriver
установлено значениеfalse.
Если установить значение true, все это не сработает (оно аварийно завершится).Ошибка заключается в следующем: «OnScroll - это не функция, это экземпляр Animated.event»
Итак, скажем, у нас есть два компонента, родительский элемент - Parent.js
, а дочерний (вид прокрутки) -ChildScrollView.js
У ChildScrollView.js
уже есть анимации в представлении прокрутки, но нам нужно добавить еще немного в компонент Parent.js
, чтобы сделать с навигацией, которую ChildScrollView.js
не может обработать
Так что это закодировано так:
Parent.js
componentWillMount() {
const { navigation } = this.props
const { scrollY } = this.state
const bgColor = scrollY.interpolate({
inputRange: [HEADER_HEIGHT / 4, HEADER_HEIGHT / 2],
outputRange: ['transparent', 'rgb(255,255,255)'],
extrapolate: 'clamp',
})
const titleColor = scrollY.interpolate({
inputRange: [0, HEADER_HEIGHT / 2],
outputRange: ['transparent', colors.paragraphs],
extrapolate: 'clamp',
})
const titleMarginTop = scrollY.interpolate({
inputRange: [0, HEADER_HEIGHT / 2],
outputRange: [HEADER_HEIGHT, 0],
extrapolate: 'clamp',
})
navigation.setParams({
bgColor,
titleColor,
titleMarginTop,
})
}
onScroll() {
}
render() {
return (
<ChildScrollView
{...childProps}
onScroll={Animated.event([
{ nativeEvent: { contentOffset: { y: scrollY } } },
], {
useNativeDriver: false, // when I do this, it become super laggy, but setting it to true makes the app crash
listener: this.onScroll,
})}
>
<MakeMeFixedOnScroll>I could do this in css with "position: sticky"</MakeMeFixedOnScroll>
</ChildScrollView>
)
}
И ребенок похож,
<Animated.ScrollView
{...props}
onScroll={Animated.event(
[{ nativeEvent: { contentOffset: { y: scrollY } } }],
{
useNativeDriver: false,
listener: event => {
if (onScroll) onScroll(event)
},
}
)}
scrollEventThrottle={16}
>