Видимость метки слайдера SwiftUI

#swiftui #slider

#swiftui #слайдер

Вопрос:

При каких обстоятельствах SwiftUI Slider видна метка слайдера? Slider инициалы могут принимать аргументы метки, но я не понимаю, для чего эта метка?

  struct ContentView: View {
    @State private var slVal: CGFloat = -20
    var body: some View {
        Slider(value: $slVal, in: -40...40, minimumValueLabel: Text("-40"), maximumValueLabel: Text("40")) {
            Text("Invisible text") // This view is not visible 
        }
        .padding()
    }
 }
  

При вводе Slider внутрь Form ярлык не отображается. Я знаю, что DatePicker метка отображается или нет в зависимости от .labelsHidden() модификатора, а также от DatePickerStyle применения .datePickerStyle() модификатора.
Есть ли что-то подобное с Slider ?

Ответ №1:

Это давно известная ошибка в SwiftUI.

Здесь возможен обходной путь. Подготовлено с помощью Xcode 12.1 / iOS 14.1 (обратная совместимость с SwiftUI 1.0)

ДЕМОНСТРАЦИЯ

 struct ContentView: View {
    @State private var slVal: CGFloat = -20
    var body: some View {
        HStack {
            Text("Invisible text")
            Slider(value: $slVal, in: -40...40, minimumValueLabel: Text("-40"), maximumValueLabel: Text("40")) {
                EmptyView()
            }
        }
        .padding()
    }
}
  

Комментарии:

1. Больше похоже на отмененную вещь, а не на жирную ошибку.

Ответ №2:

Слегка измененная версия обходного пути от @Asperi:

 func slider<V, C>(
    value: Binding<V>,
    in bounds: ClosedRange<V> = 0...1,
    label: () -> C,
    onEditingChanged: @escaping (Bool) -> Void = { _ in }
) -> some View where V : BinaryFloatingPoint,
                     V.Stride : BinaryFloatingPoint,
                     C: View {
    HStack {
        label()
        Slider(
            value: value,
            in: bounds,
            onEditingChanged: onEditingChanged,
            label: { EmptyView() }
        )
    }
}
  

и использование:

 slider(value: $aValue, in: -1...1, label: {
    Text("aValue")
})
  

Комментарии:

1. Это может быть удобно, но я надеюсь, что в какой-то момент в будущем они просто исправят ярлык, а также дадут некоторые стили ползункам, как это делается для Buttons , Pickers , Text Fields , Toggles и так далее. Может быть, здесь было бы более уместно инициализировать удобство (а не бесплатную функцию)?

Ответ №3:

Согласно официальной документации, не все стили слайдера отображают ярлыки, но даже в этих случаях SwiftUI использует ярлык для обеспечения доступности (например, VoiceOver).

Комментарии:

1. Интересно, какие стили слайдера отображают ярлыки? Я попытался создать панель инструментов macOS с помощью слайдера, и его метка скрыта.