当从 SwiftUI 中的 datePicker 中选择日期时,iOS 日期选择器闪烁

问题描述 投票:0回答:1

我已经在全屏封面中展示了 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())! }
}
ios date swiftui datepicker
1个回答
0
投票

这可能是一个 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()
}
© www.soinside.com 2019 - 2024. All rights reserved.