После просмотра React Native Documentation я, похоже, не мог понять, как сделать <ScrollView> постоянную полосу прокрутки, t исчезают. Как я могу это достичь?
React Native <ScrollView> стойкая полоса прокрутки
Ответ 1
IOS
Базовый собственный компонент iOS, UIScrollView (технически, RCTEnhancedScrollView), не поддерживает отображение индикаторов прокрутки. По этой причине оболочка React Native вокруг нее тоже не будет.
Есть хак, чтобы заставить это работать с нативным компонентом (см. этот ответ для одного подхода). Чтобы сделать это в React Native, вам нужно реализовать этот хак на нативной стороне, а затем либо создать собственный Native Module, либо разветкить React Native и изменить их компонент ScrollView.
Тем не менее, рекомендации по интерфейсу iOS Scroll View препятствуют этому, поэтому вы можете оставить поведение индикаторов в покое.
Android
Несколько подходов:
- установить
<item name="android:overScrollMode">always</item>, - установить
android:fadeScrollbars="false"в XML или - установить
ScrollView.setScrollbarFadingEnabled(false)в Java (например, в вашем собственном коде собственного моста)
Это также не рекомендуется как нестандартный интерфейс, если у вас нет веских причин для этого.
Ответ 2
Если вы посмотрите на конец, вы можете увидеть метод flashScrollIndicators(), решением "UGLY" будет время, когда он начнет мигать и сделает повторный вызов таймера, который заставит их появиться до их исчезновения.
Я не знаю, будет ли это работать и как это повлияет на производительность, но если вам это действительно нужно, это может быть решение для исправления.
Ответ 3
Я искал решение, но ничего не нашел, тогда я создал решение, надеюсь, поможет вам с этим. Я создал представление View с высотой и шириной и поместил его поверх моего scrollview, после чего я использовал реквизиты scrollview, например onMomentumScrollBegin, onMomentumScrollEnd, onContentSizeChange и onScroll
после этого я создаю условие с булевой переменной, если эта переменная имеет значение false, представление является видимым, если имеет значение false, представление является скрытым. Как активировать эту переменную? с Prop onMomentumScrollBegin, который обнаруживает, когда вы используете scrollView, и таким же образом устанавливаете переменную в false с onMomentumScrollEnd, который обнаруживает, когда прокрутка заканчивается.
Prop onContentSizeChange позволяет мне получить высоту и ширину моего scrollview, эти значения я использовал, чтобы вычислить, где будет установлен scrollbar/scrollIndicator
и, наконец, с помощью Prop On Scroll я получаю позицию.
пример:
<ScrollView
onMomentumScrollBegin={() => {this.setvarScrollState()}}
onMomentumScrollEnd={() => {this.setvarScrollStateRev()}}
scrollEventThrottle={5}
onContentSizeChange={(w, h) => this.state.hScroll = h}
showsVerticalScrollIndicator={false}
onScroll={event => { this.state.wScroll = event.nativeEvent.contentOffset.y }}
style={{ marginVertical: 15, marginHorizontal:15, width: this.state.measurements3.width}}>
{
Mydata.map((value, index) => {
return <TouchableOpacity>
<Text>{ value.MyDataItem }</Text>
</TouchableOpacity>
})
}
функции:
setvarScrollState() {
this.setState({VarScroll: true});
}
setvarScrollStateRev() {
this.setState({VarScroll: false});
}
и переменная
this.state = {VarScroll: false}
Тогда мое состояние
!this.state.VarScroll ?
<View
style = {{
marginTop: 200*(this.state.wScroll / this.state.hScroll),
marginLeft:338.5,
height: 35,
width: 2,
backgroundColor: 'grey',
position:'absolute'
}}
/>
: null
Почему 200? потому что это максимальное значение, которое может установить мой marginTop
Проверьте картинку

Конечная нота: scrollView должен быть внутри вида с другим видом (полоса прокрутки) как то так
<View>
{/*---- ScrollBar and conditions----*/}
<View>
<View>
<ScrollView>
</ScrollView>
</View>
Ответ 4
Добавление ответа, поскольку ничего из вышеперечисленного не помогло мне.
Android теперь имеет persistentScrollbar реквизиты.
iOS не поддерживает это. Поэтому я создал решение JS, которое можно использовать следующим образом:
<SBScrollView persistentScrollbar={true}>...</SBScrollView>
По сути, этот класс будет использовать persistentScrollbar для Android, в то время как добавит панель для iOS. Пока это не гладко, но функционально.
import React, { Component } from "react";
import { Platform, View, ScrollView, TouchableOpacity } from "react-native";
class SBScrollView extends Component {
state = { hScroll: 0, showScrollBar: false };
componentWillMount() {
if (this.props.persistentScrollbar) {
this.setState({ showScrollBar: true });
}
}
render() {
const { persistentScrollbar, ...attributes } = this.props;
if (Platform.OS == "android" || !persistentScrollbar) {
// Abdroid supports the persistentScrollbar
return (
<ScrollView persistentScrollbar={persistentScrollbar} {...attributes}>
{this.props.children}
</ScrollView>
);
}
const { hScroll, showScrollBar } = this.state;
// iOS does not support persistentScrollbar, so
// lets simulate it with a view.
return (
<ScrollView
ref="scrollview"
showsVerticalScrollIndicator={false}
onScroll={event => {
const ratio =
event.nativeEvent.contentSize.height /
event.nativeEvent.layoutMeasurement.height;
let hScroll;
if (ratio <= 1) {
this.setState({ showScrollBar: false });
} else {
const hScroll = event.nativeEvent.contentOffset.y * ratio;
this.setState({ hScroll, showScrollBar: true });
}
}}
{...attributes}
>
{this.props.children}
{showScrollBar && (
<View
style={{
position: "absolute",
top: hScroll,
right: 3,
backgroundColor: "#a6a6a6",
height: 160,
width: 2
}}
></View>
)}
</ScrollView>
);
}
}
export default SBScrollView;
Я надеюсь, что это может помочь другим.