SwiftUI:如何消除解雇工作表的延迟



我想在工作表出现时偏移视图,并在工作表被驳回时将其设置回原处。代码本身是有效的,但我有一个问题。

当工作表第一次出现时,一切都按预期运行。但当我取消工作表时,在偏移量返回0之前会有大约1秒的延迟。(在实际模拟器中运行显示相同的结果(

如何摆脱延迟或控制延迟持续时间?

我的代码:

import SwiftUI

struct FirstView: View {

@State var showSheet: Bool = false

var body: some View {
Text("Hello, World!")
.onTapGesture {
showSheet.toggle()
}
.sheet(isPresented: $showSheet) {
LaggyView()
.presentationDetents([.medium, .large])
}
.offset(y: showSheet ? -300 : 0)
.animation(.default, value: showSheet)
}
}
struct LaggyView: View {
var body: some View {
Text("hello")
}
}
struct FirstView_Previews: PreviewProvider {
static var previews: some View {
FirstView()
}
}

我解决这个问题的方法是在工作表设置isPresented之前将其设置为false。

为此,我在顶层视图上设置了一个.coordinateSpace(name: “someName”),并包装了带有图纸修改器的视图和GeometryReaders中的图纸内容。

在图纸内容中,我使用了顶层命名坐标空间中的图纸几何体代理的框架和全局坐标空间中包装视图的几何体框架来确定图纸内容的偏移是否大于全局框架的maxY。我不得不添加一个缓冲区,以说明带有拖动指示器的工作表的顶部。


struct OuterView: View {
var body: some View {
ContentView()
.coordinateSpace(name: "someName")
}
}
struct ContentView: View {
@State private var isPresented = false
var body: some View {
GeometryReader { containingGeometry in
EmptyView()
.sheet(isPresented: $isPresented) {
GeometryReader { geometry in
let frame = geometry.frame(in: .named("someName"))
let globalFrame = containingGeometry.frame(in: .global)
let buffer = 50.0
EmptyView()
.onChange(of: frame.origin.y) { newValue in
if newValue > globalFrame.maxY + buffer {
withAnimation {
isPresented = false
}
}
}
}
}
}
}
}

最新更新