在iOS 16.4中,我们可以在SwiftUI中使用.sheet
修饰符和.presentationDetents
来指定底部工作表的高度。我们还可以使用.presentationBackgroundInteraction
来允许与工作表后面的视图进行交互。
我遇到了一个问题,在我看来,这是一个SwiftUI错误。
您可以将此代码粘贴到一个playground中,以查看实际的错误行为(这是我的实际应用程序的简化版本)。
- 错误是,有时从一个选择更改为另一个选择时,工作表完全忽略
.presentationDetents
和.presentationBackgroundInteraction
修饰符。它只是显示为全高度模式,没有任何后台交互。*
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
let choices = [nil, "One", "Two", "Three"]
@State var selection: String?
var body: some View {
VStack {
Picker("Choose", selection: $selection) {
ForEach(choices, id: \.self) { choice in
Text(choice ?? "None")
.tag(choice)
}
}
.padding()
Spacer()
}
.pickerStyle(.segmented)
.sheet(item: $selection) { choice in
Text("Item selected: \(choice)")
.presentationDetents([.medium])
.presentationBackgroundInteraction(
.enabled(upThrough: .medium)
)
}
}
}
extension String: Identifiable {
public var id: String { self }
}
PlaygroundPage.current.setLiveView(ContentView().frame(width: 320, height: 568))
字符串
以下是一些截图:
| 无模态|修正模态|Buggy模型|
| --|--|--|
| x1c 0d1x的数据|
的|
的|
意见
1.在选择另一个选项之前隐藏工作表(通过点击“无”)* 永远不会 * 显示错误。
1.从一个选择跳到另一个选择 * 有时 *(但不总是)会显示错误,例如直接从“一”跳到“二”。
1.我的实际应用程序没有使用PickerView
,所以这与此无关。
1.我假设它忽略了presentationBackgroundInteraction
,因为它已经超过了.medium
并达到了全高度。
所以这似乎是一个问题,一个工作表的选择在改变到另一个选择之前没有通过nil状态,这对我来说是一个完全合法的事情(我不希望工作表消失然后重新出现)。
**假设这是一个真正的bug,有什么想法可以解决它吗?**我真的不想为应该在本地工作的东西编写或导入第三方库。
提前感谢您的任何见解!
2条答案
按热度按时间webghufk1#
如果你不想让工作表消失和重新出现,我不认为你可以使用
sheet(item:)
。即使presentationDetents
的bug被修复了,我认为sheet(item:)
的预期行为仍然是当项目改变时“关闭工作表,然后显示另一个”。使用
sheet(isPresented:)
代替。只要选择不为nil,就显示工作表。个字符
如果你不介意工作表的消失和再次出现,你可以添加一个单独的
@State
来预联网工作表。当selection
改变时,将该状态设置为中间值nil
。的字符串
weylhg0b2#
这不是bug.
字符串