我的视图上有一张简单的工作表。该工作表从一开始就有特定的高度,但用户可以将其拖动到 .medium 和 .large 高度。
纸张上有一个按钮。当按钮被标记时,工作表应该以新的高度显示。之后,用户可以像以前一样拖动工作表。
问题:我可以使用
.presentationDetents([.height(40), .medium, .large])
定义用户可以将工作表拖动到的高度。但我还没有到达将床单设置在特定高度(例如 200)。
当我定义像
.presentationDetents([.height(200)])
这样的自定义高度时,它会将工作表设置为200。但是用户不再可以拖动它,因为我必须消除其他高度(.medium和.large) .
这是我的代码:
import SwiftUI
struct ContentView: View {
@State private var sheetSize: Float = 60
var body: some View {
Text("Hello")
.sheet(isPresented: .constant(true)) {
Button {
if sheetSize == 40 {
sheetSize = 200 // THIS DOES NOT WORK.
}
else {
sheetSize = 60
}
print("sheetSize:", sheetSize)
} label: {
Image(systemName: "button.programmable")
.font(.largeTitle)
.frame(maxWidth: .infinity, alignment: .center)
}
.presentationDetents([.height(CGFloat(sheetSize)), .medium, .large])
.interactiveDismissDisabled()
.presentationDragIndicator(.visible)
} // Sheet
}// var body
}// struct
#Preview {
ContentView()
}
传递
Binding<PresentationDetent>
selection
参数以编程方式更改制动装置。
这里我添加了一个名为
@State
的新 currentDetent
来跟踪当前的制动装置。除了在按钮操作中设置 sheetSize
之外,您还应该设置它。
@State private var sheetSize: CGFloat = 60
@State private var currentDetent = PresentationDetent.height(60)
var body: some View {
Text("Hello")
.sheet(isPresented: .constant(true)) {
Button {
if sheetSize == 60 {
sheetSize = 200
currentDetent = .height(200)
} else {
sheetSize = 60
currentDetent = .height(60)
}
print("sheetSize:", sheetSize)
} label: {
Image(systemName: "button.programmable")
.font(.largeTitle)
.frame(maxWidth: .infinity, alignment: .center)
}
.presentationDetents([.height(sheetSize), .medium, .large], selection: $currentDetent)
.interactiveDismissDisabled()
.presentationDragIndicator(.visible)
}
}