SwiftUI:popover将持续(在外部点击时不会被解除)
我创建了这个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
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)
}
}
}
谢谢你,伙计!但这更像是一种模式