[英]Set contentInset and contentOffset in React Native's ScrollView
我试图让我的内容从 React Native 的顶部开始 100 像素。 我试过
const OFFSET = 100
const ScrollViewTest = (props) => (
<ScrollView
contentInset={{ top: OFFSET }}
contentOffset={{ y: OFFSET }}
>
<Text>Test</Text>
</ScrollView>
)
但是当我渲染屏幕时,它从 0 像素开始,但是如果我滚动一点,它会从顶部滚动到 100 像素并保持在那里。
所以看起来 React Native 在初始化时不会触发contentOffset
和contentInset
属性。
我该如何解决这个问题? 我也尝试过设置automaticallyAdjustContentInsets={false}
而不做任何更改。
此外,这些属性似乎仅适用于 iOS。 Android 有没有类似的属性?
您应该在 ScrollView 上使用带有marginTop
的contentContainerStyle
1属性。
通过使用此属性,它将应用包装您的孩子的容器(我相信在这种情况下这是您想要的),并具有在 iOS 和 Android 上工作的额外好处。
即
const OFFSET = 100
const ScrollViewTest = (props) => (
<ScrollView
contentContainerStyle={{ marginTop: OFFSET }}
>
<Text>Test</Text>
</ScrollView>
)
componentDidMount(){
if(Platform.OS==='ios'){
this.refs._scrollView.scrollToOffset({animated:false,offset:-OFFSET});
}
}
render(){
return(
<ScrollView
ref="_scrollView"
contentInset={{top: OFFSET}}
...>
...
</ScrollView>
)
}
正如我在对 Peter Theill 解决方案的评论中所写的那样,这里提出的解决方案在 100% 的情况下都不起作用,例如对于以下情况之一:
您可以使用 Peter Theill 的解决方案解决此问题,并将contentContainerStyle
替换为style={{paddingTop: headerHeight}}
。
但是,如果您还有以下典型情况,这将无济于事:
automaticallyAdjustContentInsets={false}
解决了这个问题,所以我建议尝试这个!这是我的场景中的完整解决方案(适用于 android 和 iOS):
<ScrollView
style={{paddingTop: Platform.select({android: headerHeight, ios: 0})}}
scrollIndicatorInsets={{ right: 1 }}
ref={scrollViewRef}
contentInset={{ top: headerHeight}}
contentOffset={{ x: 0, y: Platform.select({android: 0, ios: -headerHeight})}}
automaticallyAdjustContentInsets={false}
refreshControl={<RefreshControl
refreshing={refresh}
onRefresh={() => {
setRefresh(true);
setTimeout(() => setRefresh(false), 10000);
}}
colors={[inputPlaceholderGray]}
tintColor={inputPlaceholderGray}
progressViewOffset={headerHeight}
/>}
>
{CONTENT}
</ScrollView>
希望它仍然可以帮助人们,尽管这个问题已经很老了。
当我尝试从 componentDidMount 方法调用 scrollTo 时,它不会滚动。 我必须使用 setTimeout 的解决方法才能使其工作:
componentDidMount() {
setTimeout(() => this.refs._scrollView.scrollTo({ x: 100, y: 0 }) , 0);
}
填充效果:
const OFFSET = 100
const ScrollViewTest = (props) => (
<ScrollView>
<View style={{ height: OFFSET }} />
<Text>Test</Text>
</ScrollView>
)
头部效果:
const OFFSET = 100
const ScrollViewTest = (props) => (
<View style={{ paddingTop: OFFSET }}>
<ScrollView>
<Text>Test</Text>
</ScrollView>
</View >
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.