我创建了这个弹出窗口:
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
默认行为是,一旦在外面被窃听,便会被解雇。
问题: 如何将弹出式窗口设置为: -坚持不懈(在外面敲击时不被解雇)? -激活时不阻止屏幕吗?
答案 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
从下面弹出,背景变暗了一些。但您仍然可以触摸“父”视图上的所有内容
更新:忘记显示结果:
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)
}
}
}