我在Text
中有一个带有长文本的ScrollView
,我想检测用户何时滚动到文本的末尾,以便启用按钮。
我一直在调试onScroll
事件中的事件对象,但似乎没有任何价值我可以使用。
答案 0 :(得分:54)
我是这样做的:
paddingToBottom
我想添加def fillNaNs_numpy(a, b):
cm = a.cumprod()
bm = ~np.isnan(b)
a1 = np.append(1, cm[:-1])
offset = b[bm] / a1[bm]
out = a1 * offset[bm.cumsum()-1]
return out
,因为通常不需要将ScrollView滚动到底部直到最后一个像素。但是如果你想将paddingToBottom设置为零。
答案 1 :(得分:11)
<... onScroll={(e) => {
let paddingToBottom = 10;
paddingToBottom += e.nativeEvent.layoutMeasurement.height;
if(e.nativeEvent.contentOffset.y >= e.nativeEvent.contentSize.height - paddingToBottom) {
// make something...
}
}}>...
像这样反应原生0.44
答案 2 :(得分:4)
另一种解决方案可能是使用ListView
一行(您的文字),其中onEndReached
方法。请参阅文档here
答案 3 :(得分:3)
答案 4 :(得分:2)
对于水平ScrollView(例如轮播),将isCloseToBottom
函数替换为isCloseToRight
isCloseToRight = ({ layoutMeasurement, contentOffset, contentSize }) => {
const paddingToRight = 20;
return layoutMeasurement.width + contentOffset.x >= contentSize.width - paddingToRight;
};
答案 5 :(得分:2)
@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;
}
答案 6 :(得分:1)
作为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,
});
}
}
答案 7 :(得分:0)
我使用 ScrollView,这对我有用
这是我的解决方案:
我将 onMomentumScrollEnd 属性传递给了 scrollView 并在 event.nativeEvent 的基础上在 ScrollView 中实现了 onEndReached 功能
onMomentumScrollEnd={(event) => {
if (isCloseToBottom(event.nativeEvent)) {
LoadMoreRandomData()
}
}
}}
const isCloseToBottom = ({layoutMeasurement, contentOffset, contentSize}) => {
const paddingToBottom = 20;
return layoutMeasurement.height + contentOffset.y >=
contentSize.height - paddingToBottom;
};
答案 8 :(得分:0)
const isCloseToBottom = async ({ layoutMeasurement, contentOffset, contentSize }) => {
const paddingToBottom = 120
return layoutMeasurement.height + contentOffset.y >= contentSize.height - paddingToBottom}
<ScrollView
onMomentumScrollEnd={({ nativeEvent }) => {
if (isCloseToBottom(nativeEvent)) {
loadMoreData()
}
}}
scrollEventThrottle={1}
>
以上答案是正确的,但要在 scrollView 到达终点时回调 使用 onMomentumScrollEnd 而不是 onScroll