在具有 backgroundColor 的 MapView 上方时,TouchableOpacity 不可点击

Posted

技术标签:

【中文标题】在具有 backgroundColor 的 MapView 上方时,TouchableOpacity 不可点击【英文标题】:TouchableOpacity not clickable when above a MapView with backgroundColor 【发布时间】:2019-06-04 13:46:03 【问题描述】:

我在使用 TouchableOpacity 和 react-native-maps 时遇到问题。

我有一个带有 MapView 和一个 View 的 View,里面有一个绝对定位的 TouchableOpacity,如下面的代码:

<View style= flex: 1, flexDirection: 'column-reverse' >
  <MapView style= flex: 1  />
  <View style= height: 55 >
    <TouchableOpacity style= position: 'absolute', top: 100 >
      <Text>Button</Text>
    </TouchableOpacity>
  </View>
</View>

当我在这种情况下单击 TouchableOpacity 时,它按预期工作,但我需要我的内部视图具有白色背景色,如下所示:

<View style= flex: 1, flexDirection: 'column-reverse' >
  <MapView style= flex: 1  />
  <View style= height: 55, backgroundColor: '#ffffff' >
    <TouchableOpacity style= position: 'absolute', top: 100 >
      <Text>Button</Text>
    </TouchableOpacity>
  </View>
</View>

但是,一旦我将 backgroundColor 标签放入样式中,TouchableOpacity 就完全停止工作,并且 MapView 上方的所有点击实际上都被视为地图本身的点击。

有人知道如何解决这个问题吗?我确实需要在 View 中有一个背景,所以无法删除它。

【问题讨论】:

您是否尝试过禁用View 上的pointerEvents 属性?当backgroundColor not transparent 时,它可能在到达TouchableOpacity 之前捕获/吞下事件。 刚刚尝试过(我不知道 PointerEvents),但不幸的是它仍然不起作用。对我来说,目前的快速解决方案是将两个组件放在另一个视图中,并在这个外部视图中设置背景。 【参考方案1】:

尝试将视图放在 TouchableOpacity 中。

<View style= flex: 1, flexDirection: 'column-reverse' >
  <MapView style= flex: 1  />
  <TouchableOpacity style= position: 'absolute', top: 100 >
      <View style= height: 55, backgroundColor: '#ffffff' >
          <Text>Button</Text>
      </View>
  </TouchableOpacity>
</View>

【讨论】:

这对我不起作用,因为我需要视图中的各种按钮,但如果我只需要一个按钮,代码就可以工作。谢谢 你找到解决办法了吗?【参考方案2】:

为自己找到了解决方案。如果你导入 TouchableOpacity,不要这样做:

import  TouchableOpacity  from "react-native-gesture-handler";

而是这样做:

import TouchableOpacity from 'react-native';

之后,您只需将 TouchableOpacity 直接放在 MapView 下方,就像我在这里所做的那样:

         <View style=styles.container>
            <MapView 
                style=styles.map
                zoomEnabled = true
                maxZoomLevel=10
                rotateEnabled=false
                loadingEnabled=true
                onPress=e => 
                    console.log(e.nativeEvent.coordinate);
                    handleMapPress(e.nativeEvent.coordinate);
                
            />
            <TouchableOpacity style=position: "absolute", bottom: "90%", left:"5%">
                <AntDesign name="caretleft" size=40 color="orange"/>     
            </TouchableOpacity>
        </View>

您还可以将多个组件放置在 MapView 上,只需确保将它们放置在 MapView 下方,但在您的主视图中,该主视图将所有内容都包裹起来。

如果您想定位覆盖 MapView 的项目,请使用以下道具:

style=position: "absolute", bottom: "90%", left:"5%"

right、left、bottom、top 用于定位您的组件覆盖 MapView。我发现使用“%”定义非常适合此目的,因为它会根据设备显示的大小动态适应您的屏幕。

【讨论】:

以上是关于在具有 backgroundColor 的 MapView 上方时,TouchableOpacity 不可点击的主要内容,如果未能解决你的问题,请参考以下文章

TypeError .map()不是一个函数。

iOS:背景颜色——UITableView 和附件具有相同的背景颜色

如何更改 Apple Map (MKMapView) 背景颜色?

具有透明背景的 UIModalPresentationFormSheet?

具有渴望模式的 TF.data.dataset.map(map_func)

window.backgroundColor 的奇怪行为