【问题标题】:SwiftUI/macOS: DatePicker without background fieldSwiftUI/macOS:没有背景字段的 DatePicker
【发布时间】:2022-02-06 00:10:26
【问题描述】:

如何去除 macOS(!) 中 DatePicker 字段的阴影背景?
.textFieldStyle.background 无效。

我试过这个:Changing TextEditor background color in SwiftUI for macOS 但似乎只适用于 TextField、TextEditor。 是否可以设置另一个 NSView 属性?

        DatePicker("Start",
                   selection: $newDate,
                   displayedComponents: [.date])
            .datePickerStyle(.field)
//          .textFieldStyle(.plain)
//          .background(.clear)

【问题讨论】:

    标签: macos swiftui datepicker


    【解决方案1】:

    这是可表示包装方法的简化演示

    使用 Xcode 13.2 / macOS 12.1 测试

    struct DemoView: View {
        @State private var newDate: Date = Date()
    
        var body: some View {
            VStack {
                Text("Selected: \(newDate)")
                MyDatePicker(selection: $newDate)
            }
        }
    }
    
    struct MyDatePicker: NSViewRepresentable {
        @Binding var selection: Date
    
        func makeNSView(context: Context) -> NSDatePicker {
            let picker = NSDatePicker()
            picker.isBordered = false
            picker.datePickerStyle = .textField
            picker.action = #selector(Coordinator.onValueChange(_:))
            picker.target = context.coordinator
            return picker
        }
    
        func updateNSView(_ picker: NSDatePicker, context: Context) {
            picker.dateValue = selection
        }
    
        func makeCoordinator() -> Coordinator {
            Coordinator(owner: self)
        }
    
        class Coordinator: NSObject {
            private let owner: MyDatePicker
            init(owner: MyDatePicker) {
                self.owner = owner
            }
    
            @objc func onValueChange(_ sender: Any?) {
                if let picker = sender as? NSDatePicker {
                    owner.selection = picker.dateValue
                }
            }
        }
    }
    

    【讨论】:

    • 非常感谢。我正在为没有 NSDatePickerDelegate 的 NSDatePicker 苦苦挣扎——因为我对 AppKit 的了解为零……我不想要求太高,但是:还有一种方法可以在选择单元格时显示图形日历刺针吗?跨度>
    【解决方案2】:

    根据上面提到的@Davidev 的原始答案找到它。在DatePicker 上使用此扩展程序.background

    extension NSDatePicker {
        open override var frame: CGRect {
            didSet {
                backgroundColor = .clear //<<here clear
                isBezeled = false
                isBordered = false
                drawsBackground = true
            }
        }
    }
    

    【讨论】:

    • 糟糕(hack)方法 - 您更改应用程序中的所有日期选择器,此外,如果 Apple 决定更改 SwiftUI DatePicker 的内部实现(这是一个观察到的方向),那么您已经交付的应用程序最终停止工作 -用户。在 NSDatePicker 周围使用显式自己的包装器 NSViewRepresentable 并应用相应的样式会更合适。
    • 同意。我会努力的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2020-11-28
    • 2021-09-27
    • 2019-10-29
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    相关资源
    最近更新 更多