gpt4 book ai didi

ios - iPad 弹出窗口中的 NavigationView 在 SwiftUI 中无法正常工作

转载 作者:行者123 更新时间:2023-12-01 15:16:08 26 4
gpt4 key购买 nike

我有以下代码在点击按钮时显示弹出框:

struct ContentView: View {

@State private var show = false

var body: some View {

Button("Open") {
self.show.toggle()
}.popover(isPresented: $show, content: {
// NavigationView {
ScrollView {
ForEach(0...10, id: \.self) {_ in
Text("Test popover ...")
}.padding()
}
// }
})

}
}

enter image description here

如果我添加一个 NavigationView在popover的内容中,我得到了这个:

enter image description here

知道为什么会这样吗?

如果我为内容设置一个固定的框架,它工作正常,但我不想这样做,因为我希望弹出框根据它的内容调整大小。

最佳答案

可能在 iPad 上,他们在尺寸检测方面遇到了鸡蛋问题,因此只需以最低限度完成。
无论如何,解决方案是设置 .frame明确地,或者使用预定义的值(对于 iPad 来说还不错),或者使用动态计算的(例如,从外框通过 GeometryReader )
这是一个例子。使用 Xcode 12/iPadOS 14 测试
demo

struct TestPopover: View {

@State private var show = false

var body: some View {
GeometryReader { gp in
VStack {
Button("Open") {
self.show.toggle()
}.popover(isPresented: $show, content: {
NavigationView {
ScrollView { // or List
ForEach(0...10, id: \.self) {_ in
Text("Test popover ...")
}.padding()
}
.navigationBarTitle("Test", displayMode: .inline)
}
.frame(width: gp.size.width / 3, height: gp.size.height / 3)
})
}.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
}
变体 2:部分根据外部尺寸计算,部分根据内部尺寸计算。
demo2
struct TestPopover: View {

@State private var show = false
@State private var popoverWidth = CGFloat(100)

var body: some View {
GeometryReader { gp in
VStack {
Button("Open") {
self.show.toggle()
}.popover(isPresented: $show, content: {
NavigationView {
ScrollView { // or List
ForEach(0...10, id: \.self) {_ in
Text("Test popover ...").fixedSize()
}.padding()
.background(GeometryReader {
Color.clear
.preference(key: ViewWidthKey.self, value: $0.frame(in: .local).size.width)
})
.onPreferenceChange(ViewWidthKey.self) {
self.popoverWidth = $0
}
}
.navigationBarTitle("Test", displayMode: .inline)
}
.frame(width: self.popoverWidth, height: gp.size.height / 3)
})
}.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
}

struct ViewWidthKey: PreferenceKey {
typealias Value = CGFloat
static var defaultValue = CGFloat.zero
static func reduce(value: inout Value, nextValue: () -> Value) {
value += nextValue()
}
}

backup

关于ios - iPad 弹出窗口中的 NavigationView 在 SwiftUI 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61228002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com