8. 封装标题栏
创建时间:2024-11-01 01:54
长度:4192
浏览:0
评论:0
各设备的标题栏高度
const NAV_BAR_HEIGHT_IOS = 44; // 导航栏在ios中的高度
const NAV_BAR_HEIGHT_ANDROID = 50; // 导航栏在安卓上的高度
const NAV_STATUS_HEIGHT = 20; // ios要设置状态栏的高度, 安卓上已经了,不用再设置了
检查当前是啥设置
import { Platform } from 'react-native';
Platform.OS === 'ios'; // 值有ios android macos web windows
在react native 封装的
和上面的图片差不多,没测试过
import React,{Component} from 'react'
import {ViewPropTypes, Text, StatusBar, StyleSheet, View, Platform,DeviceInfo} from 'react-native'
import {PropTypes} from 'prop-types';
const NAV_BAR_HEIGHT_IOS = 44;//导航栏在iOS中的高度
const NAV_BAR_HEIGHT_ANDROID = 50;//导航栏在Android中的高度
const NAV_BAR_HEIGHT = Platform.OS === 'ios' ? NAV_BAR_HEIGHT_IOS : NAV_BAR_HEIGHT_ANDROID;
const STATUS_BAR_HEIGHT = (Platform.OS !== 'ios' || DeviceInfo.isIPhoneX_deprecated) ? 0 : 20;//状态栏的高度
const StatusBarShape = {//设置状态栏所接受的属性
barStyle: PropTypes.oneOf(['light-content', 'default',]),
hidden: PropTypes.bool,
backgroundColor: PropTypes.string,
};
export const NAVIGATION_BAR_HEIGHT = NAV_BAR_HEIGHT + STATUS_BAR_HEIGHT;
export default class NavigationBar extends Component {
//提供属性的类型检查
static propTypes = {
style: ViewPropTypes.style,
title: PropTypes.string,
titleView: PropTypes.element,
titleLayoutStyle: ViewPropTypes.style,
hide: PropTypes.bool,
statusBar: PropTypes.shape(StatusBarShape),
rightButton: PropTypes.element,
leftButton: PropTypes.element,
};
//设置默认属性
static defaultProps = {
statusBar: {
barStyle: 'light-content',
hidden: false,
}
};
render() {
let statusBar = !this.props.statusBar.hidden ?
<View style={styles.statusBar}>
<StatusBar {...this.props.statusBar} />
</View> : null;
let titleView = this.props.titleView ? this.props.titleView :
<Text ellipsizeMode="head" numberOfLines={1} style={styles.title}>{this.props.title}</Text>;
let content = this.props.hide ? null :
<View style={styles.navBar}>
{this.getButtonElement(this.props.leftButton)}
<View style={[styles.navBarTitleContainer, this.props.titleLayoutStyle]}>
{titleView}
</View>
{this.getButtonElement(this.props.rightButton)}
</View>;
return (
<View style={[styles.container, this.props.style]}>
{statusBar}
{content}
</View>
)
}
getButtonElement(data) {
return (
<View style={styles.navBarButton}>
{data ? data : null}
</View>
)
}
}
const styles = StyleSheet.create({
container: {
backgroundColor: '#2196f3'
},
navBarButton: {
alignItems: 'center'
},
navBar: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
height: NAV_BAR_HEIGHT,
},
navBarTitleContainer: {
alignItems: 'center',
justifyContent: 'center',
position: 'absolute',
left: 40,
right: 40,
top: 0,
bottom: 0
},
title: {
fontSize: 20,
color: 'white',
},
statusBar: {
height: STATUS_BAR_HEIGHT,
}
});
调用
let statusBar = {
backgroundColor: theme.themeColor,
barStyle: 'light-content',
};
<NavigationBar
title={'最热'}
statusBar={statusBar}
style={theme.styles.navBar}
rightButton={this.renderRightButton()}
/>;
renderRightButton() {
const {theme} = this.props;
return <TouchableOpacity
onPress={() => {
//新版本友盟SDK 时间统计方法由 track -> onEvent
AnalyticsUtil.onEvent("SearchButtonClick");
NavigationUtil.goPage({theme}, 'SearchPage')
}}
>
<View style={{padding: 5, marginRight: 8}}>
<Ionicons
name={'ios-search'}
size={24}
style={{
marginRight: 8,
alignSelf: 'center',
color: 'white',
}}/>
</View>
</TouchableOpacity>
}
在Expo自定义
在expo中已经定义好了,只要在app/_layout.tsx 或者app/tabs/_layout.tsx里设置就行,