7

我需要放置一个<View>withposition: 'absolute'以便它可以覆盖下面的另一个视图。我希望它不会出现在 iOS 的状态栏后面,所以我将所有内容都放在了<SafeAreaView>.

不幸的是,绝对位置似乎是相对于全屏而不是其父视图(SafeAreaView)。

有诀窍吗?

const styles = StyleSheet.create({
    safeAreaView: {
      flex: 1,
    },
    map: {
      flex: 1,
    },
    userLocationButton: {
      position: 'absolute',
      right: 12,
      top: 12,
    },
  });

  return (
    <SafeAreaView style={styles.safeAreaView}>
        <ClusteredMapView style={styles.map} />
      )}
        <TouchableOpacity style={styles.userLocationButton}>
          <Image source={UserLocationButton} />
        </TouchableOpacity>
      )}
    </SafeAreaView>
  );

在此处输入图像描述

4

3 回答 3

21

我有同样的问题,通过用另一个视图包装绝对元素来修复它。

<SafeAreaView style={{flex: 1}}>
    <View style={{flex: 1}}>
        <TouchableOpacity style={{height: 40, width: 40, borderRadius: 20}} />
    </View>
</SafeAreaView>
于 2020-02-01T12:11:57.233 回答
2

将状态栏大小值添加到绝对样式的顶部

从此函数 getStatusBarHeight() 获取状态栏大小

import { Dimensions, Platform, StatusBar } from 'react-native';
function isIphoneX() {
  const dimen = Dimensions.get('window');
  return (
    Platform.OS === 'ios' &&
    !Platform.isPad &&
    !Platform.isTVOS &&
    (dimen.height === 812 ||
      dimen.width === 812 ||
      (dimen.height === 896 || dimen.width === 896))
  );
}
export function getStatusBarHeight(skipAndroid) {
    return Platform.select({
        ios: isIPhoneX() ? 44 : 20,
        android: skipAndroid ? 0 : StatusBar.currentHeight,
        default: 0
    })
}
于 2020-01-22T13:15:39.257 回答
1

对我来说有帮助的是在具有位置的元素之上添加overflow: hidden样式。Viewabsolute

<SafeAreaView style={{ flex: 1 }}>
    <View style={{ overflow: 'hidden' }}>
        <View style={{ position: 'absolute' }}></View>
    </View>
</SafeAreaView>
于 2021-04-08T21:11:58.333 回答