SwiftUI: установка высоты строки средства выбора - PullRequest
0 голосов
/ 06 мая 2020

Для крупных шрифтов строки в Picker перекрываются. Как изменить высоту строки Picker's? (Подсказка: модификатор .lineSpacing этого не делает.)

См. Также

Этот вопрос аналогичен вопросу Ejaaz , но на него пока нет ответа.

Проблема

picker view

Код

Следующий исполняемый код дает указанный выше результат. Мне не нужны линии разного размера, я просто хочу, чтобы большие шрифты подходили по размеру. Я пробовал вставлять Spacers, добавляя сюда и там модификаторы .frame, .lineSpacing, padding() ... может просто не нашел нужной комбинации?

struct ContentView: View {
    @State private var selected = 0

    var body: some View {
        Picker(selection: self.$selected, label: Text("Letters")) {
            Text("A").font(.system(size: 30))
            Text("B").font(.system(size: 40))
            Text("C").font(.system(size: 50))
            Text("D").font(.system(size: 60))
            Text("E").font(.system(size: 70))
            Text("F").font(.system(size: 80))
        }
    }
}

1 Ответ

2 голосов
/ 06 мая 2020

enter image description here вам нужно обернуть UIPickerView в UIVieweRepresentable, а затем использовать

 func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat 

, чтобы изменить высоту строки.

пример: (это просто показывает, как чтобы изменить высоту строки, вам все равно нужно расширить ее для своего содержимого ...)

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 picker = UIPickerView(frame: .zero)

        picker.dataSource = context.coordinator
        picker.delegate = context.coordinator

        return picker
    }

    //updateUIView(_:context:)
    func updateUIView(_ view: UIPickerView, context: UIViewRepresentableContext<PickerView>) {
//        for i in 0...(self.selections.count - 1) {
//            view.selectRow(self.selections[i], inComponent: i, animated: false)
//        }
    }

    class Coordinator: NSObject, UIPickerViewDataSource, UIPickerViewDelegate {
        var parent: PickerView

        //init(_:)
        init(_ pickerView: PickerView) {
            self.parent = pickerView
        }

        func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
            return 80
        }

        //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
        }

        //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
        }
    }
}
...