【问题标题】:Bring View on top of Modal using zIndex style with React-Native使用带有 React-Native 的 zIndex 样式将视图置于 Modal 之上
【发布时间】:2017-02-07 13:06:33
【问题描述】:

zIndex 最近被引入 React-Native 以更改 View 在层堆栈中的位置。

虽然,我无法将View 放在Modal 组件之上。

我的代码如下所示:

render() {
  return (
    <View>
      <Modal visible>
        {props.children}
      </Modal>
      <View style={{ zIndex: 1000 }}>
        <Text>Loading...</Text>
      </View>
    </View>
  );
}

我想我可以停止使用 &lt;Modal&gt; 并创建一个常规动画 &lt;View&gt;,其行为类似于 Modal,但我宁愿找到其他解决方案。

有什么想法吗?

【问题讨论】:

  • 您找到解决方案了吗?我正在努力解决同样的问题。
  • 2019年还没有解决办法?

标签: javascript android ios react-native


【解决方案1】:

const styles =  StyleSheet.create({
  modal: {
    backgroundColor: 'white',
    margin: 0, // This is the important style you need to set
    alignItems: undefined,
    justifyContent: undefined,
  }

<Modal isVisible={true} style={styles.modal}>
  <View style={{ flex: 1 }}>
    <Text>Hello!</Text>
 </View>
</Modal>

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

我一直在努力解决同样的问题,最后,我解决了。这是我发现的:

首先,问题: 问题是模态出现在所有屏幕层的顶部,这意味着它将显示在所有应用程序元素上,因此如果您同时打开两个模态,应用程序将使其全部相互显示,因为应用程序不知道是什么modals order 它应该是,因此,您会看到您的 modals 在另一个后面。

二、解决办法: 要使第二个模态在第一个模态上打开,您需要安排模态打开的顺序,这意味着您打开父模态然后打开子模态。 为此,我使用了 Promise,它允许我像以下步骤示例一样执行此操作:-

1 - 创建承诺

const [isOpen, setOpen] = useState({ backDrop: false, modal: false }); // modals open state

function openDialog() {
    return new Promise((resolve) => {
        setOpen((previous) => ({ ...previous, backDrop: props.isOpen }))
        resolve()
    })
}

2 - 我使用useEffect() 触发模态打开道具,然后调用异步函数,该函数将在上述第一步等待openDialog() 函数,然后在调用第一个函数后设置打开状态。

useEffect(() => {
    (async function () {
        await openDialog()
        setOpen((previous) => ({ ...previous, modal: props.isOpen }))
    }())
}, [props.isOpen])

这是您如何控制打开预先安排好的模态并相互叠加的方式

【讨论】:

    【解决方案3】:

    不幸的是,再多的zIndex 操作都不会带来高于反应原生Modal 的东西。 Modal 组件是一个原生视图,位于 react-native 应用程序的其余部分之上。将某些东西放在它上面的唯一方法是将某些东西放在模态本身中,或者使用仅 js 实现的模态。

    顺便说一句,模式的 react-native-community 版本也是基于 react-native 模式构建的,所以会有同样的问题。这里有一个关于不同js实现的讨论: https://github.com/react-native-community/react-native-modal/issues/145

    【讨论】:

      【解决方案4】:

      无法使用模态。因为无论 zIndex 是什么以及屏幕中的其他组件,模态都应该始终显示

      它会一直显示给你,除非你设置为 visible=false

      实现你想要的。您可以使用带有一些 zIndex 技巧的绝对定位视图来前后移动该视图。

      render() {
        return (
          <View>
             <View style={{position:'absolute',top:0,bottom:0,left:0,right:0,zIndex:visible?-1:2}}>
                {props.children}
             </View>
             <View style={{ zIndex: 1 }}>
                <Text>Loading...</Text>
             </View>
           </View>
        );
      }
      

      【讨论】:

        【解决方案5】:

        您必须更改模态而不是视图之一的 z-index(值 1 的 z-index 就足够了):

        render() {
          return (
            <View>
              <Modal visible style={{ zIndex: 1 }}>
                {props.children}
              </Modal>
              <View>
                <Text>Loading...</Text>
              </View>
            </View>
          );
        }
        

        具有较大 z-index 的元素通常会覆盖具有较低 z-index 的元素 (MDN docs)。

        编辑:

        另一种解决方案是改变元素的顺序:

        render() {
          return (
            <View>
              <View>
                <Text>Loading...</Text>
              </View>
              <Modal visible>
                {props.children}
              </Modal>
            </View>
          );
        }
        

        使用此解决方案,您不需要z-index,因为模态框已经在视图顶部。

        【讨论】:

        • 此解决方案不起作用。我的模态框上的 zIndex 为 1,加载视图上的 zIndex 为 10。
        • 你必须交换它们。 z-index 越大,元素在视图层次结构中的“更高”。尝试在您的模态框上设置一个 10 的 z-index
        • 不幸的是,我无法更改元素的顺序:(
        • OP 试图在模态框之上覆盖一个视图,而不是相反(这是默认的)
        • 这行不通,因为模态将始终位于您的“应用程序”之上
        猜你喜欢
        • 1970-01-01
        • 2016-10-01
        • 2016-11-17
        • 2017-11-23
        • 2019-06-12
        • 2019-07-31
        • 2015-06-09
        • 2017-05-16
        • 1970-01-01
        相关资源
        最近更新 更多