SwiftUI UIDatePicker .compact不会直接转到弹出窗口

用户名

我使用创建了一个自定义的DatePicker UIDatePicker,当我选择该字段时,它在屏幕底部将日期和时间显示为选项,而无需直接转到弹出窗口。不确定如何描述它,因此请参见下图:

DatePicker视图

请在下面查看我的代码:

import SwiftUI

struct CustomDateTimePicker: View {
@State private var date: Date?
@State private var time: String? = "Time"

var body: some View {
    HStack {
        Image("Time")
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width: 22.0, height: 22.0, alignment: .center)
        DateField("", date: self.$date)
            .font(.system(size: 19, weight: .light, design: .rounded))
            .foregroundColor(Color.gray)
    }.padding()
    .frame(width: 200, height: 100)
    .background(Color.white)
    .cornerRadius(8)
    .shadow(color: Color.black.opacity(0.1), radius: 30, x: 0 , y: 15)
}
}

class DateTextField: UITextField {
// MARK: - Public properties
@Binding var date: Date?

// MARK: - Initializers
init(date: Binding<Date?>) {
    self._date = date
    super.init(frame: .zero)
    
    if let date = date.wrappedValue {
        self.datePickerView.date = date
    }
    
    self.datePickerView.addTarget(self, action:  #selector(dateChanged(_:)), for: .valueChanged)
    self.inputView = datePickerView
    self.tintColor = .clear
    self.font = UIFont.systemFont(ofSize: 18.0, weight: .medium)
}

@available(*, unavailable)
required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

// MARK: - Private properties
private lazy var datePickerView: UIDatePicker = {
    let datePickerView = UIDatePicker()
    datePickerView.datePickerMode = .dateAndTime
    datePickerView.minuteInterval = 5
    if #available(iOS 14.0, *) {
        datePickerView.preferredDatePickerStyle = .compact
        datePickerView.sizeToFit()
    } else {
        datePickerView.preferredDatePickerStyle = .wheels
    }
    return datePickerView
}()

// MARK: - Private methods
@objc func dateChanged(_ sender: UIDatePicker) {
    self.date = sender.date
}
}

struct DateField: UIViewRepresentable {
// MARK: - Public properties
@Binding var date: Date?

// MARK: - Initializers
init<S>(_ title: S, date: Binding<Date?>, formatter: DateFormatter = .yearMonthDay) where S: StringProtocol {
    self.placeholder = String(title)
    self._date = date
    self.textField = DateTextField(date: date)
    self.formatter = formatter
}

// MARK: - Public methods
func makeUIView(context: UIViewRepresentableContext<DateField>) ->  UITextField {
    textField.placeholder = placeholder
    return textField
}

func updateUIView(_ uiView: UITextField, context:   UIViewRepresentableContext<DateField>) {
    if let date = date {
        uiView.text = formatter.string(from: date)
    }
}


// MARK: - Private properties
private var placeholder: String
private let formatter: DateFormatter
private let textField: DateTextField
}

extension DateFormatter {
    static var yearMonthDay: DateFormatter {
        let formatter = DateFormatter()
        formatter.dateFormat = "dd MMM yyyy HH:mm"
        return formatter
    }
}

struct CustomDateTimePicker_Previews: PreviewProvider {
    static var previews: some View {
        CustomDateTimePicker()
    }
}

单击字段后,如何不必在底部选择日期/时间,如何显示紧凑菜单?

洛普伊普森

使用Compact DatePicker,如果不从底部显示的部分中选择日历,将无法自动显示日历。在iOS 14中以编程方式打开UIDatePicker

您可以(如果不需要5分钟间隔)使用GraphicalDatePickerStyle显示非常相似的日历。

struct ParentDatePicker: View  {
    @State var showGraphical: Bool = false
    @State var currentDate: Date = Date()
    var dateFormatter: DateFormatter {
        let formatter = DateFormatter()
        formatter.dateFormat = "dd MMM yyyy HH:mm"
        return formatter
    }
    var body: some View {
        Button(action: {
            showGraphical.toggle()
        }, label: {
            Label(
                title: { Text("\(currentDate, formatter: dateFormatter)") },
                icon: { Image(systemName: "clock") })
        })
        .padding()
        .frame(width: 200, height: 100)
        .background(Color.white)
        .cornerRadius(8)
        .shadow(color: Color.black.opacity(0.1), radius: 30, x: 0 , y: 15)
        .sheet(isPresented: $showGraphical, content: {
            CusDatePicker(currentDate: $currentDate)
        })
    }
}
struct CusDatePicker: View {
    @Binding var currentDate: Date
    
    var body: some View {
        //https://developer.apple.com/documentation/swiftui/datepicker
        DatePicker("Date", selection: $currentDate, displayedComponents: [.date, .hourAndMinute])
            //.datePickerStyle(CompactDatePickerStyle())
            .datePickerStyle(GraphicalDatePickerStyle())
    }
}

struct CusDatePicker_Previews: PreviewProvider {
    static var previews: some View {
        ParentDatePicker()
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SwiftUI:如何创建自定义UIDatePicker

来自分类Dev

MvvmCross:UIDatePicker时间更改不会触发绑定

来自分类Dev

UIDatePicker不会打印出日期

来自分类Dev

在SwiftUI中更改弹出窗口的大小

来自分类Dev

UIDatePicker与UIToolbar

来自分类Dev

UIDatePicker时间

来自分类Dev

SwiftUI NavigationView自行弹出

来自分类Dev

具有.compact样式的UIDatePicker不尊重包含优先权的内容

来自分类Dev

SwiftUI @Published和@ObservedObject不会转到NavigationLink目标

来自分类Dev

SwiftUI图像不会更新

来自分类Dev

SwiftUI视图不会更新

来自分类Dev

由于没有EnvironmentObject的弹出窗口,SwiftUI Mac OS崩溃

来自分类Dev

SwiftUI样式更新onEditChanged不会弹出键盘

来自分类Dev

UITextField 不会在 UIDatePicker 动作事件时触发动作事件

来自分类Dev

如何从uitableviewcell显示uidatepicker

来自分类Dev

带有UIDatePicker的IQKeyboardManager

来自分类Dev

UIDatePicker结果为dateByAddingTimeInterval

来自分类Dev

带“完成”按钮的UIDatePicker

来自分类Dev

UIDatePicker valueChanged as wheels spin?

来自分类Dev

新的UIDatePicker作为inputView

来自分类Dev

UIDatePicker“ copyWithZone”错误

来自分类Dev

从UIDatePicker快速访问年份

来自分类Dev

保存UIDatePicker值

来自分类Dev

用于周数的 UIDatePicker

来自分类Dev

SwiftUI导航自动关闭/弹出-Realm

来自分类Dev

SwiftUI通过链接列表动态弹出NavigationLink

来自分类Dev

弹出视图可推送当前视图SwiftUI

来自分类Dev

Swift UIDatePicker用于文本字段输入-如何使UIDatePicker消失?

来自分类Dev

Swift IOS UIDatepicker-UIDatepicker显示不正确