SwiftUI:弹出框可持久保存(在外部轻按时不会消失)

时间:2019-11-27 07:51:26

标签: swiftui popover

我创建了这个弹出窗口:

SELECT Customers.CustomerName as 'Name', COUNT(*) OVER (PARTITION BY Customers.CustomerName ORDER BY Customers.CustomerName)AS 'Order Count'
FROM Orders LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID

enter image description here

默认行为是,一旦在外面被窃听,便会被解雇。

问题: 如何将弹出式窗口设置为:  -坚持不懈(在外面敲击时不被解雇)?  -激活时不阻止屏幕吗?

2 个答案:

答案 0 :(得分:1)

我尝试玩.popover.sheet,但没有找到更接近的解决方案。 .sheet可以为您提供模式视图,但会阻止父视图。因此,我可以为您提供使用ZStack并为用户做出类似行为的方法:

import SwiftUI

struct Popover: View {

    @State var showingPopover = false

    var body: some View {

        ZStack {

            // rectangles only for color control
            Rectangle()
                .foregroundColor(.gray)

            Rectangle()
                .foregroundColor(.white)
                .opacity(showingPopover ? 0.75 : 1)

            Button(action: {
                withAnimation {
                    self.showingPopover.toggle()
                }
            }) {
                Image(systemName: "square.stack.3d.up")
            }

            ModalView()
                .opacity(showingPopover ? 1: 0)
                .offset(y: self.showingPopover ? 0 : 3000)
        }

    }
}

// it can be whatever you need, but for arrow you should use Path() and draw it, for example
struct ModalView: View {

    var body: some View {

        VStack {
            Spacer()

            ZStack {
                Rectangle()
                    .frame(width: 520, height: 520)
                    .foregroundColor(.white)
                    .cornerRadius(10)

                Rectangle()
                    .frame(width: 500, height: 500)
                    .foregroundColor(.black)
            }

        }
    }

}

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

此处ModalView从下面弹出,背景变暗了一些。但您仍然可以触摸“父”视图上的所有内容

更新:忘记显示结果:

enter image description here

PsS :从这里开始,您可以走得更远。例如,您可以将所有内容放到GeometryReader中以计算ModalView的位置,添加最后一个.gesture(DragGesture()...)以再次偏移底部的视图,依此类推。

答案 1 :(得分:0)

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

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)
       }
    }
}