react native是否有“固定标头”或“粘性标头”?

ev7lccsx  于 2023-03-19  发布在  React
关注(0)|答案(3)|浏览(243)

有没有一种方法可以让react native拥有固定的、渗透性的顶部标题栏(我想它被称为Header?)
就像状态栏一样,它总是在那里,但它需要在顶部(甚至在React导航的“标题”之前)
我的计划是在那里放置一个全局搜索输入,这样你就可以在应用程序的任何地方搜索(搜索内容不受当前屏幕的影响。纯全局搜索始终可用。)
有办法做到这一点吗?我目前正在与博览会和React导航。
---编辑
我添加了一个线框图的截图来说明我的意思。你会注意到,无论你在哪个屏幕上,搜索栏都停留在顶部。这是一个全局搜索栏。
--编辑
我想我需要清楚地说明这一点。我正在尝试使用ReactNavigation来实现这一点。我想我需要使用“createAppContainer”或任何创建导航器函数(如“createDrawerNavigator”),并找出一种方法来将固定的标题与可导航屏幕放在一起。

pinkon5k

pinkon5k1#

react native的组件FlatList有一个属性ListHeaderComponent用于渲染头文件,还有一个属性用于粘贴头文件stickyHeaderIndices,这正是我们所需要的。
ListHeaderComponent中,您将呈现搜索字段,并使用stickyHeaderIndices={[0]}将其设置为粘性标题:

<FlatList
    data={ this.state.data }
    renderItem={({item}) =>  this.renderItem(item)}
    ListHeaderComponent={this.renderHeader}
    stickyHeaderIndices={[0]}
/>

查看正在运行的example

km0tfn4u

km0tfn4u2#

您需要创建一个带有position: 'absolute'样式属性的组件(以及一个设置minHeight-您想要的搜索栏高度),然后您可以将其导入到根级别组件中,并在应用内容的其余部分(页面容器)上放置一个marginTop: ...样式属性,该属性等于您为页眉/搜索栏设置的minHeight
这样,页眉将显示在所有页面上,而应用的其余内容不会显示在页眉后面。
您可以找到此here的基本示例

zpqajqem

zpqajqem3#

我发现自己的方式。=)
因此,关键是引入自定义导航器。
自定义导航器可以扩展我现有的选项卡导航器,呈现部分几乎可以返回我想要的任何东西加上我的TabNavigator将拥有的常规视图。
我的应用程序有抽屉和标签导航器。所以在我的情况下,抽屉导航器有一堆路线,其中一个路线是自定义导航器,扩展标签导航器。
下面是我的代码:

const MyTab = createBottomTabNavigator({
  FirstTabStack,
  SecondTabStack,
  ThirdTabStack,
  FourthTabStack,
});

class CustomNavigator extends React.Component {
  static router = MyTab.router;
  render() {
    const { navigation } = this.props;

    return (
      {/* This SafeAreaView is from ReactNavigation. 
          forceInset-bottom-never is needed because  the 
          TabNavigator is already Safe-area-ing the bottom. 
          You don't want to do it again.*/}
      <SafeAreaView style={{ flex: 1 }} forceInset={{ bottom: 'never' }}>
        {/* SearchHeader is zIndex: 1(or elevation: 1) for the absolute 
            positioned stuff that appears and cover the 
            screen after focusing on Input. */}
        <SearchHeader/>
        <MyTab navigation={navigation} />
      </SafeAreaView>
    );
  }
}

export default createDrawerNavigator({
  CustomNavigator,
  SettingsScreen,
  LegalScreen,
  FeedbackScreen,
  VersionScreen,
}, {
  drawerType: 'slide',
  drawerWidth: 260,
});

另外,如果你想让绝对位置视图覆盖TabNavigator的渲染区域,请确保iOS使用zIndex,Android使用elevation!!在我的例子中,SearchHeader组件具有:

const styles = StyleSheet.create({
  container: {
    ...Platform.select({
      ios: {
        zIndex: 1,
      },
      android: {
        elevation: 1
      },
    }),
  },
  {...}
})

相关问题