我已经在全屏封面中展示了 datePicker。当我从 datePicker 中选择日期时,第一次选择时它会闪烁或高度增加。
我尝试向 datePicker 添加框架。 我尝试在 .onAppear() 上添加日期 我希望如果用户选择日期,datePicker 高度不应增加。
struct ContentView: View {
@State var text = "Hola"
@State var date = Date()
@State private var check: Bool = false
var body: some View {
VStack {
Button("Select Date") {
check.toggle()
}
.fullScreenCover(isPresented: $check, onDismiss: {
// Update the text when the full-screen cover is dismissed
text = formattedDate(date: date)
}) {
DatePickerView(date: $date)
}
Text(text)
.padding()
}
}
func formattedDate(date: Date) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
return dateFormatter.string(from: date)
}
}
struct DatePickerView: View {
@Binding var date: Date
var body: some View {
VStack {
DatePicker("", selection: $date, in: Date()...Date.tomorrow, displayedComponents: [.date])
.labelsHidden()
.datePickerStyle(GraphicalDatePickerStyle())
.fixedSize(horizontal: false, vertical: true) // Prevent dynamic resizing
.frame(width: 300, height: 400) // Fixed size
.background(Color.white)
.cornerRadius(10)
.shadow(radius: 10)
.onAppear {
date = $date.wrappedValue
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.gray.opacity(0.5).edgesIgnoringSafeArea(.all))
}
}
extension Date {
static var tomorrow: Date { return Calendar.current.date(byAdding: .day, value: 4, to: Date())! }
}
这可能是一个 SwiftUI 错误。我发现您尝试使用
date
以编程方式更改 date = $date.wrappedValue
,以在用户看到日期选择器之前更新日期选择器。你确实可以朝这个方向走,但是你需要将 date
设置为 different 值,等待 SwiftUI 触发视图更新,然后将其设置回原始值。
我愿意:
.task {
date.addTimeInterval(1)
try? await Task.sleep(nanoseconds: 1)
date.addTimeInterval(-1)
}
您还可以使用 SwiftUI-Introspect 在底层
invalidateInstrinsicContentSize
上调用 UIDatePicker
,但这仅适用于您明确指定的 iOS 版本。
.introspect(.datePicker, on: .iOS(.v13, .v14, .v15, .v16, .v17, .v18)) { datePicker in
datePicker.invalidateIntrinsicContentSize()
}