SwiftUI:popover将持续(在外部点击时不会被解除)

SwiftUI:popover将持续(在外部点击时不会被解除),swiftui,popover,Swiftui,Popover,我创建了这个popover: import SwiftUI struct Popover : View { @State var showingPopover = false var body: some View { Button(action: { self.showingPopover = true }) { Image(systemName: "square.stack.3d.up") } .popover(isPre

我创建了这个popover:

import SwiftUI

struct Popover : View {
  @State var showingPopover = false

  var body: some View {

    Button(action: {
      self.showingPopover = true
    }) {
      Image(systemName: "square.stack.3d.up")
    }
    .popover(isPresented: $showingPopover){

    Rectangle()

      .frame(width: 500, height: 500)

    }
  }
}

struct Popover_Previews: PreviewProvider {
    static var previews: some View {
        Popover()
        .colorScheme(.dark)
        .previewDevice("iPad Pro (12.9-inch) (3rd generation)")
    }
}

默认的行为是,一旦在外部被点击,就会被解雇

问题: 如何将popover设置为: -坚持(在外部点击时不被驳回)?
-激活时不阻止屏幕?

我试图玩
.popover
.sheet
但甚至没有找到解决方案
.sheet
可以显示模式视图,但它会阻止父视图。因此,我可以让您使用
ZStack
并做出类似的行为(针对用户):

导入快捷界面
结构Popover:视图{
@状态变量showingPopover=false
var body:一些观点{
ZStack{
//矩形仅用于颜色控制
矩形()
.foregroundColor(.灰色)
矩形()
.foregroundColor(.白色)
.不透明度(显示Popover?0.75:1)
按钮(操作:{
动画片{
self.showingPopover.toggle()
}
}) {
图像(系统名称:“square.stack.3d.up”)
}
莫达维尤()
.不透明度(显示Popover?1:0)
.偏移量(y:self.showingPopover?0:3000)
}
}
}
//它可以是您需要的任何内容,但对于arrow,您应该使用Path()并绘制它,例如
结构ModalView:视图{
var body:一些观点{
VStack{
垫片()
ZStack{
矩形()
.框架(宽度:520,高度:520)
.foregroundColor(.白色)
.转弯半径(10)
矩形()
.框架(宽:500,高:500)
.foregroundColor(.黑色)
}
}
}
}
结构Popover_预览:PreviewProvider{
静态var预览:一些视图{
爆米花()
.colorScheme(.dark)
.previewDevice(“iPad Pro(12.9英寸)(第三代)”)
}
}
这里从下方弹出
ModalView
,背景颜色稍微暗一点。但你仍然可以在你的“家长”视图中触摸一切

更新:忘记显示结果:


p.S.:从这里你可以走得更远。例如,您可以将所有内容放入
GeometryReader
进行计数
ModalView
位置,为最后一个
位置添加手势(Dragesture())
以再次偏移底部下方的视图,依此类推。

您只需使用常量(showingPopover)而不是$showingPopover。当您使用$时,它将使用绑定,并在您在弹出框外按并关闭弹出框时更新@State变量。如果使用.constant(),它将只从@State变量中读取值,而不会关闭popover。 您的代码应该如下所示:

struct Popover : View {

  @State var showingPopover = false

  var body: some View {
    Button(action: {
      self.showingPopover = true
    }) {
      Image(systemName: "square.stack.3d.up")
    }
    .popover(isPresented: .constant(showingPopover)) {
       Rectangle()
         .frame(width: 500, height: 500)
       }
    }
}

谢谢你,伙计!但这更像是一种模式