SwiftUI/macOS: 没有背景字段的 DatePicker
SwiftUI/macOS: DatePicker without background field
如何去除 macOS (!) 中 DatePicker
字段的阴影背景?
.textFieldStyle
或 .background
无效。
我试过这个: 但似乎只适用于 TextField、TextEditor。
是否还有另一个 NSView 属性 可以设置?
DatePicker("Start",
selection: $newDate,
displayedComponents: [.date])
.datePickerStyle(.field)
// .textFieldStyle(.plain)
// .background(.clear)
根据上面提到的@Davidev 的原始答案找到了。在 DatePicker
上使用此扩展程序 .background
。
extension NSDatePicker {
open override var frame: CGRect {
didSet {
backgroundColor = .clear //<<here clear
isBezeled = false
isBordered = false
drawsBackground = true
}
}
}
这是可表示包装器方法的简化演示
测试 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
}
}
}
}
如何去除 macOS (!) 中 DatePicker
字段的阴影背景?
.textFieldStyle
或 .background
无效。
我试过这个:
DatePicker("Start",
selection: $newDate,
displayedComponents: [.date])
.datePickerStyle(.field)
// .textFieldStyle(.plain)
// .background(.clear)
根据上面提到的@Davidev 的原始答案找到了。在 DatePicker
上使用此扩展程序 .background
。
extension NSDatePicker {
open override var frame: CGRect {
didSet {
backgroundColor = .clear //<<here clear
isBezeled = false
isBordered = false
drawsBackground = true
}
}
}
这是可表示包装器方法的简化演示
测试 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
}
}
}
}