Почему в SwiftUI есть ряд колес выбора, почему области перетаскивания для прокрутки смещены от элементов управления выбора на экране? - PullRequest
0 голосов
/ 17 октября 2019

Я работаю над представлением SwiftUI, цель которого - позволить пользователю ввести сумму в долларах. Мне нужна строка из семи сборщиков в стиле колесика, каждое из значений которых представляет собой цифры от 0 до 9.

Следующий код работает, за исключением , который при попытке коснуться и перетащить цифруЧтобы прокрутить колонку, я обнаружил, что мой жест перетаскивания вызывает не тот Пикер, к которому я прикасаюсь, а прокрутку, несколько столбцов вправо. Другими словами, область перетаскивания для каждого средства выбора смещается немного левее того места, где на экране появляется сам столбец средства выбора.

Я пытался установить границы для видов, но все, кажется, в нужном месте. Любые идеи, что вызывает это или как это исправить?

import SwiftUI

struct CurrencyPickerView: View {

    @State private var centsDigit: Int = 0
    @State private var tenCentsDigit: Int = 0
    @State private var onesDigit: Int = 0
    @State private var tensDigit: Int = 0
    @State private var hundredsDigit: Int = 0
    @State private var thousandsDigit: Int = 0
    @State private var tenThousandsDigit: Int = 0

    var body: some View {
        let pickerWidth = CGFloat(20)
        return HStack {
            Picker(selection: $tenThousandsDigit, label: EmptyView()) {
                ForEach((0...9), id: \.self) { ix in
                    Text("\(ix)").tag(ix)
                }
            }.frame(width: pickerWidth)

            Picker(selection: $thousandsDigit, label: EmptyView()) {
                ForEach((0...9), id: \.self) { ix in
                    Text("\(ix)").tag(ix)
                }
            }.frame(width: pickerWidth)

            Picker(selection: $hundredsDigit, label: EmptyView()) {
                ForEach((0...9), id: \.self) { ix in
                    Text("\(ix)").tag(ix)
                }
            }.frame(width: pickerWidth)

            Picker(selection: $tensDigit, label: EmptyView()) {
                ForEach((0...9), id: \.self) { ix in
                    Text("\(ix)").tag(ix)
                }
            }.frame(width: pickerWidth)

            Picker(selection: $onesDigit, label: EmptyView()) {
                ForEach((0...9), id: \.self) { ix in
                    Text("\(ix)").tag(ix)
                }
            }.frame(width: pickerWidth)

            Text(".")

            Picker(selection: $tenCentsDigit, label: EmptyView()) {
                ForEach((0...9), id: \.self) { ix in
                    Text("\(ix)").tag(ix)
                }
            }.frame(width: pickerWidth)

            Picker(selection: $centsDigit, label: EmptyView()) {
                ForEach((0...9), id: \.self) { ix in
                    Text("\(ix)").tag(ix)
                }
            }.frame(width: pickerWidth)

        }
    }
}

1 Ответ

0 голосов
/ 18 октября 2019

Применение .clipped() к каждому .frame(...) решило проблему. Предположительно, области касания для этих колес Пикера были представлены за пределами области рамки (которая используется для макета, но по сути не ограничивает содержимое рамками рамки) и перекрывались способами, которые вызывали странный эффект смещения. Использование .clipped() не позволяет SwiftUI отображать / активировать контент вне фрейма, и теперь колеса выбора работают правильно.

...