iOS 16.4,SwiftUI底部工作表有时会忽略演示Detents

icnyk63a  于 11个月前  发布在  iOS
关注(0)|答案(2)|浏览(94)

在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,有什么想法可以解决它吗?**我真的不想为应该在本地工作的东西编写或导入第三方库。

提前感谢您的任何见解!

webghufk

webghufk1#

如果你不想让工作表消失和重新出现,我不认为你可以使用sheet(item:)。即使presentationDetents的bug被修复了,我认为sheet(item:)的预期行为仍然是当项目改变时“关闭工作表,然后显示另一个”。
使用sheet(isPresented:)代替。只要选择不为nil,就显示工作表。

.sheet(isPresented: isNotNil($selection)) {
    if let selection {
        Text("Item selected: \(selection)")
            .presentationDetents([.medium])
            .presentationBackgroundInteraction(.enabled(upThrough: .medium))
    }
}

个字符
如果你不介意工作表的消失和再次出现,你可以添加一个单独的@State来预联网工作表。当selection改变时,将该状态设置为中间值nil

@State var sheetItem: String?
.onChange(of: selection) { x in
    sheetItem = nil
    DispatchQueue.main.async {
        sheetItem = x
    }
}
.sheet(item: $selection) { choice in ... }

的字符串

weylhg0b

weylhg0b2#

这不是bug.

.sheet(item: $selection) { choice in
    Text("Item selected: \(choice)")
        .id(choice)
        .presentationDetents([.medium])
        .presentationBackgroundInteraction(
            .enabled(upThrough: .medium)
        )
}

字符串

相关问题