Text
内に長いテキストを持つScrollView
があり、ユーザーがボタンを有効にできるようにテキストの最後までスクロールしたことを検出したい。
onScroll
イベントからイベントオブジェクトをデバッグしましたが、使用できる値はないようです。
私はこのようにしました:
import React from 'react';
import {ScrollView, Text} from 'react-native';
const isCloseToBottom = ({layoutMeasurement, contentOffset, contentSize}) => {
const paddingToBottom = 20;
return layoutMeasurement.height + contentOffset.y >=
contentSize.height - paddingToBottom;
};
const MyCoolScrollViewComponent = ({enableSomeButton}) => (
<ScrollView
onScroll={({nativeEvent}) => {
if (isCloseToBottom(nativeEvent)) {
enableSomeButton();
}
}}
scrollEventThrottle={400}
>
<Text>Here is very long lorem ipsum or something...</Text>
</ScrollView>
);
export default MyCoolScrollViewComponent;
通常、ScrollViewを最後のピクセルまで下にスクロールする必要はないため、paddingToBottom
を追加しました。ただし、必要な場合はpaddingToBottomをゼロに設定します。
<... onScroll={(e) => {
let paddingToBottom = 10;
paddingToBottom += e.nativeEvent.layoutMeasurement.height;
if(e.nativeEvent.contentOffset.y >= e.nativeEvent.contentSize.height - paddingToBottom) {
// make something...
}
}}>...
このような反応ネイティブ0.44
ここで人々が助けてくれたので、私は彼らが書く簡単なコードを追加して、一番上に到達し、一番下に到達するイベントを作成し、物事をより簡単にするために少し説明しました
<ScrollView
onScroll={({nativeEvent})=>{
if(isCloseToTop(nativeEvent)){
//do something
}
if(isCloseToBottom(nativeEvent)){
//do something
}
}}
>
...contents
</ScrollView>
isCloseToBottom({layoutMeasurement, contentOffset, contentSize}){
return layoutMeasurement.height + contentOffset.y >= contentSize.height - 20;
}
ifCloseToTop({layoutMeasurement, contentOffset, contentSize}){
return contentOffset.y == 0;
}
別の解決策は、ListView
メソッドを持つ単一行(テキスト)でonEndReached
を使用することです。ドキュメントを参照してください here
@Henrik Rの権利。ただし、Math.ceil()も使用する必要があります。
function handleInfinityScroll(event) {
let mHeight = event.nativeEvent.layoutMeasurement.height;
let cSize = event.nativeEvent.contentSize.height;
let Y = event.nativeEvent.contentOffset.y;
if(Math.ceil(mHeight + Y) >= cSize) return true;
return false;
}
水平ScrollView(カルーセルなど)の場合、isCloseToBottom
関数をisCloseToRight
に置き換えます
isCloseToRight = ({ layoutMeasurement, contentOffset, contentSize }) => {
const paddingToRight = 20;
return layoutMeasurement.width + contentOffset.x >= contentSize.width - paddingToRight;
};
Henrik Rの答えに加えて:
マウント時にユーザーがコンテンツの最後に到達したかどうかを知る必要がある場合(コンテンツがデバイスのサイズに応じて長すぎる場合とそうでない場合)-ここに私の解決策があります:
<ScrollView
onLayout={this.onLayoutScrollView}
onScroll={this.onScroll}>
<View onLayout={this.onLayoutScrollContent}>
{/*...*/}
</View>
</ScrollView>
と組み合わせて
onLayout(wrapper, { nativeEvent }) {
if (wrapper) {
this.setState({
wrapperHeight: nativeEvent.layout.height,
});
} else {
this.setState({
contentHeight: nativeEvent.layout.height,
isCloseToBottom:
this.state.wrapperHeight - nativeEvent.layout.height >= 0,
});
}
}