LoginSignup
0
1

More than 1 year has passed since last update.

【SwiftUI】WheelDatePickerStyleが壊れてるから自作した

Last updated at Posted at 2022-09-04

はじめに

上記の記事ではPickerでしたが、今回はDatePickerです。
DatePickerにもwheelスタイルが存在し、Pickerと同様に壊れています。
使い物になるDatePickerをUIKitを使って作っていきます。

問題

struct ContentView: View {
    @State var date: Date = Date()
    var body: some View {
        DatePicker("", selection: $date, displayedComponents: .hourAndMinute)
            .datePickerStyle(WheelDatePickerStyle())
            .frame(width: 200, height: 80, alignment: .center)
            .background(Color.yellow)
            .clipped()
    }
}

このようになります。(わかりやすいように背景色を付けてます)
Simulator Screen Shot - iPhone 12 - 2022-09-04 at 20.36.41.png
一見問題なさそうに見えますが重大なバグが潜んでいます。
下記の画像の青い部分が全てDatePickerの判定になっています。
どういうことかと言うと、青い部分をスクロールすればホイールが反応してしまう訳です。
スクリーンショット 2022-09-04 20.40.08.png

画面収録_2022-09-04_20_42_04_AdobeExpress.gif

実装

WheelTimePickerView
struct WheelTimePickerView: UIViewRepresentable {
    @Binding private var selection: Date

    init(selection: Binding<Date>) {
        self._selection = selection
    }

    func makeUIView(context: Context) -> UIDatePicker {
        let picker = UIDatePicker(frame: .zero)

        picker.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
        picker.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

        picker.preferredDatePickerStyle = .wheels
        picker.datePickerMode = .time

        picker.addTarget(context.coordinator, action: #selector(Coordinator.changed(_:)), for: .valueChanged)

        return picker
    }

    func updateUIView(_ uiDatePicker: UIDatePicker, context: Context) {
        uiDatePicker.date = selection
    }

    func makeCoordinator() -> Coordinator {
        return Coordinator(self)
    }

    class Coordinator: NSObject {
        var wheelTimePickerView: WheelTimePickerView

        init(_ wheelTimePickerView: WheelTimePickerView) {
            self.wheelTimePickerView = wheelTimePickerView
        }

        @objc func changed(_ sender: UIDatePicker) {
            self.wheelTimePickerView.selection = sender.date
        }
    }
}

完成形

スクリーンショット 2022-09-04 20.47.05.png

範囲も修正されています。
スクリーンショット 2022-09-04 20.46.19.png

おわり

iOS16では修正されていることを願います

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1