【问题标题】:createMaterialTopTabNavigator inside ScrollView with dynamic height具有动态高度的 ScrollView 内的 createMaterialTopTabNavigator
【发布时间】:2020-03-27 15:33:55
【问题描述】:

有什么方法可以创建像具有动态高度的 ScrollView 之类的东西吗?

关于我们正在尝试做的事情的详细信息:

我们在ScrollView 中创建了一个顶部标签栏(使用createMaterialTopTabNavigator)。一切正常,除了 ScrollView 的高度。 Let's assume there are 3 tab screens with different heights: TabScreen1: 800, TabScreen2: 400, TabScreen3: 300... At rendering, the ScrollView takes the greatest height, and when Tab2 or 3 is selected, the height of our ScrollView remains at 800,所以 Tab2 和 3 有滚动空间。

【问题讨论】:

  • 告诉我你是如何在 tabNavigator 中实现滚动的。
  • 这只是 HomeStack.Navigator (HomeStack = createMaterialTopTabNavigator()) 中的一个屏幕,例如 <HomeStack.Screen name="tab_1" ...etc />。在 tab_1 中,您可以像往常一样使用ScrollView。我还将滚动视图包裹在 View 组件中,flex: 1

标签: react-native scrollview react-navigation


【解决方案1】:

正如我所承诺的,这就是我们解决它的方法。

在你有ScrollView 的班级中,你需要一个类似的状态

const [activeTab, setActiveTab] = useState('tab1') //your default (first) tab

稍后,您希望每次更改选项卡时都更改该状态:

<TabsStack.Screen
  name={'tab1'}
  component={
    activeTab === 'tab1' ? Tab1Screen : DefaultScreen
  }
  listeners={{ focus: () => setActiveTab('tab1') }}
/>

现在,每当一个选项卡被取消选择或没有聚焦时,它都会显示 DefaultScreen 这是一个空视图,并且 没有高度,例如:

const DefaultScreen = () => (
  <Box
    flex={1}
    py={20}
    alignItems="center"
    justifyContent="center"
    bg="background"
  >
    <ActivityIndicator size="large" color="white" animating />
  </Box>
)

在我的情况下(见上面的问题),每次我从 Tab1.1.1 切换到 Tab1.1.2 时,Tab1.1.1 都会更改为 DefaultScreen

【讨论】:

  • 这正是我一直在寻找的,除了现在当我从高度较高的屏幕底部切换到高度较低的屏幕底部时,整个 ScrollView 都会弹出以匹配新高度。有人解决了吗?
  • @SameerIngavale “弹出”是什么意思?你的意思是它会跳到你的 ScrollView 的顶部吗?
  • 乍一看没看懂,后来看懂了,谢谢!
【解决方案2】:

试试这样的, 将父小部件的高度固定为您希望该选项卡导航器拥有的最大屏幕高度。

<ListView or ScrollView>
 <View style={{height:  (width)/(0.8)}} >
    <Tab.Navigator tabBar={(props) => <TabBar {...props} />}>
      <Tab.Screen name="T1" component={T1} />
      <Tab.Screen name="T2" component={T2} />
      <Tab.Screen name="T3" component={T3} />
    </Tab.Navigator>
   </View>
</ ListView or ScrollView>

对于标签做这样的事情

T1->

<View style={styles.container}>
  <ScrollView nestedScrollEnabled={true}>
    <FlatList
      numColumns={3}
      data={allMedia}
      keyExtractor={(item) => item.id}
      listKey={(post) => `${post.id}D`}
      renderItem={({ item }) => (Anything)}
      scrollEnabled ={false}
    />
  </ScrollView>
</View>

记得在选项卡的 FlatList 中禁用滚动视图,并使用带有 nestedScrollEnabled={true} 的 ScrollView 进行包装

【讨论】:

    【解决方案3】:

    不需要将 TabNavigator 放在 ScrollView 中。将 ScrollView 放在每个 TabScreen 内

    回答您的问题:如果您的 ScrollView 与内容的高度相同,则它不会滚动。您可能在谈论 ScrollView 的 contentContainer 的高度。动态设置它的唯一方法是使用onLayout 测量当前选定选项卡的内容高度,将此数字保存到状态并将其应用为滚动视图的contentContainerStyle 属性中的高度。除非绝对必要,否则我不建议以这种方式破解它

    【讨论】:

    • 你要明白,TabNavigator并不是我们ScrollView里面唯一的一项,上面还有一个TabNavigator。此外,顶部还有一个轮播 - 我将在我的问题中添加一个示例。我们也尝试在 contentContainerStyle 中应用高度,但它不接受。
    • 我了解您的问题。 RN 中对嵌套的 ScrollViews 和 FlatLists 没有很好的支持,并且您的设置必须已经向您发送垃圾邮件警告。你唯一能做的就是破解你的方式。我强烈建议您调查 ScrollView 高度和 contentContainer 高度之间的差异。 contentContainerStyle 确实非常适合身高
    • 我认为这里的问题是,无论我们传入什么内容,在运行时 ScrollView 总是以最大高度的内容的高度结束。但好消息是我们已经解决了(或找到解决方法)该问题。我将在接下来的几天内发布解决方案 - 只要我有时间。非常感谢您的努力:)
    • 很高兴您找到了解决方案。请注意,尽管 ScrollView 本身不应该采用任何高度 - 您需要为它定义一个高度 - 要么使用 flex: 1 和明确的高度父母,要么明确地通过 passig 高度。如果你不这样做并且 ScrollView 扩展到内容的高度,这意味着它不会自行滚动,并且与仅 View 没有什么不同
    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 2016-03-05
    • 2020-03-13
    • 1970-01-01
    • 2013-04-28
    • 2014-03-06
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多