29

有没有办法找出 react-native 的 listview/scrollview 组件的滚动方向?

原生 iOS 组件似乎可以通过计算与 的偏移量来做到这一点scrollViewWillBeginDraggingscrollViewDidScroll但这些似乎没有绑定。

4

2 回答 2

54

您可以使用 ScrollView 的 onScroll 事件并在事件回调中检查 contentOffset:

https://rnplay.org/apps/FltwOg

'use strict';

var React = require('react-native');
var {
  AppRegistry,
  StyleSheet,
  ScrollView,
  Text,
  View,
} = React;

var SampleApp = React.createClass({
  offset: 0,
  onScroll: function(event) {
    var currentOffset = event.nativeEvent.contentOffset.y;
        var direction = currentOffset > this.offset ? 'down' : 'up';
    this.offset = currentOffset;
    console.log(direction);
  },
  render: function() {
    return (
      <View style={styles.container}>
        <ScrollView style={styles.scroller} onScroll={this.onScroll}>
          <Text>Scrollable content here</Text>
        </ScrollView>
      </View>
    )
  }
});

var styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: 50,
  },
  scroller: {
    height: 5000,
  },
});

AppRegistry.registerComponent('SampleApp', () => SampleApp);
于 2016-04-23T15:51:59.997 回答
17

当新旧偏移量之间的差异非常小时,alexp 的解决方案无法准确指定方向。所以我把它们过滤掉了。

  _onScroll = event => {
    const currentOffset = event.nativeEvent.contentOffset.y;
    const dif = currentOffset - (this.offset || 0);

    if (Math.abs(dif) < 3) {
      console.log('unclear');
    } else if (dif < 0) {
      console.log('up');
    } else {
      console.log('down');
    }

    this.offset = currentOffset;
  };
于 2017-06-30T19:49:06.400 回答