我正在使用nativebase.io作为我的应用程序的UI框架。
当我为IOS设备输入标题时,如果iPhone模拟器正在模拟iPhone X(屏幕顶部有一个缺口),则Header元素会自动检测到该标题并将Header元素移至屏幕。
某些android设备在屏幕顶部也有一个类似的凹口,但是当我使用nativebase.io Header元素时,它无法检测到凹口,并且Header与凹口重叠。
react-native或nativebase.io上是否有办法检测显示是否有缺口?这样,我可以动态抵消页眉。
答案 0 :(得分:8)
由于问题出在Android上,也许您应该尝试查看StatusBar.currentHeight。由于该槽口通常是状态栏的一部分,因此在标题的顶部添加一个填充,状态栏的大小应该可以做到这一点。
答案 1 :(得分:5)
我正在使用此答案https://stackoverflow.com/a/53593067/923497中的方法,对我来说效果很好。
在React Native中看起来像
import { StatusBar, Platform } from 'react-native';
if (Platform.OS === 'android') {
const hasNotch = StatusBar.currentHeight > 24;
}
答案 2 :(得分:1)
不使用Expo
如果您使用的是无Expo的React Native或已弹出的Expo应用,则可以使用react-native-device-info
软件包。它具有hasNotch()
函数,可以很好地检测此类设备。
Native Base Content
,Footer
和Header
组件检查isIphoneX
主题变量,以确定是否为设备槽口增加间距。
您可以customized your Native Base theme并修改变量文件以使用react-native-device-info
来检测凹口:
# native-base-theme/variables/*.js
import DeviceInfo from 'react-native-device-info';
...
isIphoneX = DeviceInfo.hasNotch();
...
现在,您的Native Base Header
,Footer
和Content
组件应为带有槽口的设备添加适当的间距。
使用博览会
由于react-native-device-info
在Expo项目中不起作用,因此没有简单的方法来执行此操作。您将必须编写一个函数来实现您的目标。如果您检查hasNotch()
source code,则会注意到该函数只是基于设备的brand
和model
进行数组查找。您可以使用Expo Constants来获得设备型号,但是这样做并不容易:
import { Platform } from 'react-native;
import Constants from 'expo-constants';
const getDeviceModel = () => Platform.select({
ios: Constants.platform.ios.model,
android: Constants.deviceName
});
但是,无法使设备brand
进入Expo。显然,所有ios
设备都具有Apple
品牌,但Android设备品牌则难以捉摸。您也许可以构造仅使用设备model
的查找数组,但可能不那么精确。
我希望世博会用户有更好的解决方案。
答案 3 :(得分:1)
前往“安全区域视图”。
SafeAreaView的目的是在安全区域内呈现内容 设备的边界。目前仅适用于iOS设备 使用iOS 11或更高版本。
答案 4 :(得分:0)
尝试使用React Native上可用的SafeAreaView。 包装当前视图。 有关更多信息,请参见此链接: https://facebook.github.io/react-native/docs/safeareaview
allow(GoogleMapsService::Client).to receive(:new)
答案 5 :(得分:0)
我一直在使用这个库“ react-native-status-bar-height”,并且效果很好。
https://www.npmjs.com/package/react-native-status-bar-height
答案 6 :(得分:0)
我创建了一个获取缺口高度的函数
getNotchHeight = () => {
let notchHeight = 0;
if (Platform.OS == 'ios') {
if (getStatusBarHeight() == 20) {
notchHeight = 25;
}
else if (getStatusBarHeight() > 20) {
notchHeight = getStatusBarHeight()+34;
}
}
else if (Platform.OS == 'android') {
if (getStatusBarHeight() > 25) {
notchHeight = 0;
}
else {
notchHeight = getStatusBarHeight();
}
}
return notchHeight;
}