我想找到一种以编程方式滚动到scrollView底部的方法。在查看ScrollView的源代码后,我知道了scrollTo方法,但是我似乎无法找到一种方法来测量scrollView的内容大小。
环顾四周之后,我遇到了this github问题,提到了如何使用" UIManager.measureX方法"衡量内容大小。但是,在通过源代码搜索了几次后,我似乎无法找到这些方法的使用位置。
有人能指出我正确的方向吗?
答案 0 :(得分:14)
这是非常有用的,我遇到了源代码。
您可以尝试这样:
需要:
var RCTUIManager = require('NativeModules').UIManager;
渲染:
<ScrollView ref = {component=>{this._scrollView=component;}}>
</ScrollView>
事件:
someEvent: function() {
RCTUIManager.measure(this._scrollView.getInnerViewNode(), (...data)=>{console.log(data)});
}
从数据中,您可以获得scrollview的内容大小,其高度是data
的第四个元素。当然,您可以从中获取内容偏移量。请访问RCTUIMananger.m
的源代码以获取更多详细信息。
当您使用getInnerViewNode
时,您可以获得ScrollView内部视图框架的框架。如果你想获得ScrollView的框架,你应该使用React.findNodeHandle(this._scrollView)
,而ScrollView的框架并不总是等于它的内部视图的框架。
(更新)
如果您想将(...data)=>{console.log(data)}
替换为callback
,则应该像这样使用它:
RCTUIManager.measure(this._scrollView.getInnerViewNode(), callback.bind(this));
答案 1 :(得分:2)
Yo可以使用ScrollView的 scrollToEnd()方法:
https://facebook.github.io/react-native/docs/scrollview.html#scrolltoend
根据文件: 如果这是垂直ScrollView滚动到底部。如果这是一个水平ScrollView向右滚动。
答案 2 :(得分:1)
有更好的方法来做到这一点。粗略地说:
使用ListView呈现聊天。
<ListView
ref="list"
...
使用renderFooter使用onLayout添加页脚到列表,以保存其y
位置。页脚不必呈现任何可见的内容,只是空View
。所有你正在寻找的是列表的底部。
renderFooter={() => {
return <View onLayout={(e)=> {
this.footerY = e.nativeEvent.layout.y;
}}/>
}},
将onLayout
处理程序添加到保存列表ListView
的{{1}}本身。
height
使用这两位信息,您可以使用以下内容滚动到列表底部:
onLayout={(e)=>{
this.listHeight = e.nativeEvent.layout.height;
}}
滚动到底部的频率取决于您,并取决于您想要的行为。
此实例的一个示例是GiftedMessenger。
答案 3 :(得分:1)
虽然RCTUIManager.measure()
通过引用提取数据数组的第4个元素,但是在使用ScrollViews时使用以下内容更合适(也更容易):
RE:https://facebook.github.io/react-native/docs/scrollview.html#oncontentsizechange
onContentSizeChange={( contentWidth, contentHeight ) => {
this._contentHeight = contentHeight
}}
一旦内部子组件完成布局并在更改后,此事件将触发。这对我有用,我在推荐内容界限时推荐这种支持的方法。
答案 4 :(得分:0)
<ScrollView ref={scrollView => this.scrollView = scrollView}
onContentSizeChange={( contentWidth, contentHeight ) => {
this._contentHeight = contentHeight;
console.log('Height: ' + this._contentHeight);
this.scrollView.scrollTo({ y: this._contentHeight , animated: true})
}}>