我需要使用UIPickerView而不是SwiftUI Picker,因为它存在一些错误,并且我需要更多控制权。
以下方法可以正常工作,但我需要一个宽度更小的Picker(大约为原始宽度的70%),但仍然显示所有三个选择器,并且仍具有灰色背景的圆角(因此灰色背景框宽度和三个选择器之间的间距应减小)。
我尝试修改Picker及其父视图的框架,但根本不起作用。在SwiftUI中设置框架宽度,然后使用clipped修饰符会剪切掉圆角和某些数字部分(所以这种方式无法使用)。
有人知道如何做到这一点吗?非常感谢!
import SwiftUI
struct ContentView: View {
@State private var selections: [Int] = [5, 10, 50]
var body: some View {
MainPicker(pickerSelections: self.$selections)
}
}
struct MainPicker: View {
@Binding var pickerSelections: [Int]
private let data: [[String]] = [
Array(0...59).map { "\($0 < 10 ? "0" : "")" + "\($0)" },
Array(0...59).map { "\($0 < 10 ? "0" : "")" + "\($0)" },
Array(0...59).map { "\($0 < 10 ? "0" : "")" + "\($0)" }
]
var body: some View {
HStack{
PickerView(data: data, selections: self.$pickerSelections)
}
}
}
struct PickerView: UIViewRepresentable {
var data: [[String]]
@Binding var selections: [Int]
//makeCoordinator()
func makeCoordinator() -> PickerView.Coordinator {
Coordinator(self)
}
//makeUIView(context:)
func makeUIView(context: UIViewRepresentableContext<PickerView>) -> UIPickerView {
let hoursLabel = UILabel()
let minLabel = UILabel()
let secLabel = UILabel()
hoursLabel.text = "h"
minLabel.text = "m"
secLabel.text = "s"
let picker = UIPickerView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) //doesnt work
picker.dataSource = context.coordinator
picker.delegate = context.coordinator
picker.superview?.frame = CGRect(x: 0, y: 0, width: 100, height: 100) //doesnt work
return picker
}
//updateUIView(_:context:)
func updateUIView(_ view: UIPickerView, context: UIViewRepresentableContext<PickerView>) {
for i in 0...(self.selections.count - 1) {
if(context.coordinator.initialSelection[i] != self.selections[i]){
view.selectRow(self.selections[i], inComponent: i, animated: false)
context.coordinator.initialSelection[i] = self.selections[i]
}
}
}
class Coordinator: NSObject, UIPickerViewDataSource, UIPickerViewDelegate {
var parent: PickerView
var initialSelection = [-1, -1, -1]
//init(_:)
init(_ pickerView: PickerView) {
self.parent = pickerView
}
//numberOfComponents(in:)
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return self.parent.data.count
}
//pickerView(_:numberOfRowsInComponent:)
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.parent.data[component].count
}
func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
return 50
}
//pickerView(_:titleForRow:forComponent:)
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return self.parent.data[component][row]
}
//pickerView(_:didSelectRow:inComponent:)
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.parent.selections[component] = row
}
}
}