リアクトネイティブ: v0.52.0
プラットフォーム:iOS
私のFlatList
コード:
<FlatList
horizontal
pagingEnabled={true}
showsHorizontalScrollIndicator={false}
legacyImplementation={false}
data={this.props.photos}
renderItem={item => this.renderPhoto(item)}
keyExtractor={photo => photo.id}
ItemSeparatorComponent={this.itemSeparatorComponent}
/>
アイテムセパレータコード:
itemSeparatorComponent = () => {
return <View style = {
{
height: '100%',
width: 5,
backgroundColor: 'red',
}
}
/>
}
そして最後にFlatList
項目コンポーネント:
renderPhoto = ({ item, index }) => {
return (
<View style = {{ width: SCREEN_WIDTH, height: 'auto' }}>
<FastImage
style = { styles.photo }
resizeMode = { FastImage.resizeMode.contain }
source = {{ uri: item.source.uri }}
/>
</View>
)
}
しかし、スクロールするとき、FlatList
はセパレーターへのオフセットを作成しますが、アイテムの左端へのオフセットは作成しません。
そして、新しい要素ごとに、FlatList
は前のすべてのセパレーターの幅をオフセットに追加します。
FlatList
コンポーネントに、水平スクロールでセパレーターコンポーネントの幅を考慮させ、適切なオフセットを設定する方法
私は同じユースケースを持っていました。解決策を探している人のために、ここにあります。
ステップ1)ItemSeparatorComponent
propを使用しないでください。代わりに、renderItem
コンポーネントでインラインにレンダリングします。
ステップ2)(キーポイント)。 width
のheight
プロパティでstyle
とFlatList
を指定します。あなたの場合、width
はSCREEN_WIDTH + 5
である必要があります。
次に、ページ付けが有効になっている場合、Flatlist
は自動的に画面全体(写真+セパレータ)を移動します。これで、コードは次のようになります。
<FlatList
horizontal
pagingEnabled={true}
showsHorizontalScrollIndicator={false}
legacyImplementation={false}
data={this.props.photos}
renderItem={item => this.renderPhoto(item)}
keyExtractor={photo => photo.id}
style={{width: SCREEN_WIDTH + 5, height:'100%'}}
/>
写真コードをレンダリングする:-
renderPhoto = ({ item, index }) => {
return (
<View style = {{ width: SCREEN_WIDTH + 5, height: 'auto',
flexDirection:'row'}}>
<FastImage
style = { styles.photo }
resizeMode = { FastImage.resizeMode.contain }
source = {{ uri: item.source.uri }}
/>
{this. itemSeparatorComponent()}
</View>
)}
アイテムセパレータコード:
itemSeparatorComponent = () => {
return <View style = {
{
height: '100%',
width: 5,
backgroundColor: 'red',
}
}
/>
}
それでも理解できない場合は、次のコンポーネントを見てください。
https://github.com/zachgibson/react-native-parallax-swiper
実装に入ると、この人がAnimated.ScrollView
に幅と高さを提供していることがわかります。
https://github.com/zachgibson/react-native-parallax-swiper/blob/master/src/ParallaxSwiper.js
行番号:93-97
renderPhoto
関数で返す最上位のビューの幅はSCREEN_WIDTH
ですが、ItemSeparatorComponent
の 各アイテムの間にレンダリングされる は、スタイルの定義に従って5の幅を占めています。その結果、スクロールする追加の項目ごとに、その初期オフセットは左側に5ピクセル多くなります。
これを修正するには、ItemSeparatorComponent
を完全に削除するか(pagingEnabled
を既にtrueに設定しているため)、renderPhoto
に返されるトップレベルビューの幅をSCREEN_WIDTH - 2.5
に設定します。これにより、1つの写真の右端にアイテムセパレータの半分が表示され、次の写真の左端に残りの半分が表示されます。
実際には、もう1つの可能な解決策は、アイテムセパレーターを削除し、renderPhoto
View
の幅をSCREEN_WIDTH + 5
に設定して、これらの追加のプロパティをスタイルに含めることです:{paddingRight: 5, borderRightWidth: 5, borderRightColor: 'red'}
。この方法では、pagingEnabled
プロパティのため、左と右にスクロールするまで赤いセパレーターは表示されません。