使用 Introspect Swift 包
在 SwiftUI 中这并不是一件小事。不过我做了一些研究。
SwiftUI 背后的底层类Picker
返回到UIKit
这是UIPickerView
。要自定义其行为,您需要访问UIPickerView
类和文档有些严重缺乏。
看看 SO 上的其他帖子,配置选择器的方法似乎一直到 objC,例如使用setValue(_ value: Any?, forKey key: String)
功能。我什至找不到这些钥匙的列表!然而,尝试设置文本的颜色不起作用...我发现我可以访问子视图并可以解决这个背景颜色问题。
这只是说我认为我发现的最好方法是使用这个名为内省 https://github.com/siteline/SwiftUI-Introspect.
这些家伙(和女孩)确实做得非常出色。
import Introspect
extension View {
public func introspectUIPickerView(customize: @escaping (UIPickerView) -> ()) -> some View {
return inject(UIKitIntrospectionView(
selector: { introspectionView in
guard let viewHost = Introspect.findViewHost(from: introspectionView) else {
return nil
}
return Introspect.previousSibling(containing: UIPickerView.self, from: viewHost)
},
customize: customize
))
}
}
- 在您的代码中,您现在可以访问
UIPickerView
,您的 SwiftUI 的底层 UIKit 类Picker
。在选择器后面添加以下内容:
Picker("Flavor", selection: $selectedFlavor) {
ForEach(Flavor.allCases) { flavor in
Text(flavor.rawValue.capitalized)
}
}
.pickerStyle(WheelPickerStyle()
.introspectUIPickerView { picker in
picker.subviews[1].backgroundColor = UIColor.clear
}
我使用了来自的 Picker 示例苹果文档 https://developer.apple.com/documentation/swiftui/picker并添加了.introspectUIPickerView
修饰符。
结果:不再有灰色突出显示颜色。
并不是所有的东西都能工作,因为 UIPickerView 真的很旧而且有些东西不容易定制。因此,如果您想定制其他东西,您的里程可能会有所不同:)
这里用红色表示:
.introspectUIPickerView { picker in
picker.subviews[1].backgroundColor = UIColor.red
.withAlphaComponent(0.2)
}