Элемент средства выбора SwiftUI .ForegroundColor() не работает

#swift #xcode #swiftui

#swift #xcode #swiftui

Вопрос:

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

 Picker("Theme Color", selection: $themeColor) {
    ForEach(0..<themeColors.count) { _ in
        Text("Color").foregroundColor(.blue)
    }
}.pickerStyle(SegmentedPickerStyle())
  

Это просто невозможно в SwiftUI?

Ответ №1:

Ну … ничего прямого, но вы можете поиграть со следующим подходом… что позволяет получить некоторые интересные эффекты (возможно, кто-то может подойти)

Демо подготовлено и протестировано с Xcode 12 / iOS 14

демо1

     Picker("Theme Color", selection: $themeColor) {
         ForEach(0..<4) { _ in
              Text("Color")
         }
    }.pickerStyle(SegmentedPickerStyle())
    .colorMultiply(.white).colorInvert()
  

и даже

demo2

     Picker("Theme Color", selection: $themeColor) {
         ForEach(0..<4) { _ in
              Text("Color")
         }
    }.pickerStyle(SegmentedPickerStyle())
    .colorMultiply(.white).colorInvert()
    .colorMultiply(.orange).colorInvert()
  

Ответ №2:

Мне удалось change изменить цвет переднего плана средства выбора, но это было далеко не хорошо, поскольку выбранный элемент не будет читаемым. Учитывая мой неудачный опыт работы с сегментированным средством выбора в iOS 13 и тот факт, что в то время я не мог изменить размер средства выбора, я думаю, что средства выбора по-прежнему не настраиваются, и, как и я, вам нужно будет написать свой собственный средство выбора, если вы хотите более настраиваемый.

Ответ №3:

В SwiftUI 2 по- Picker прежнему поддерживается UISegmentedControl .

Это означает, что вы можете использовать UISegmentedControl.appearance() модификаторы:

 UISegmentedControl.appearance().selectedSegmentTintColor = .systemOrange
UISegmentedControl.appearance().backgroundColor = .systemRed
  

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

1. Это приближает меня, но есть ли способ изменить каждый из них по отдельности?

2. @JoeScotto Вы можете установить цвет фона индивидуально, но я не знаю решения для выбранного элемента (вы всегда можете попробовать решение Аспери).

3. Как бы вы это сделали для каждого элемента? Выбранному мне просто нужна граница или что-то в этом роде.

4. @JoeScotto Вы можете сделать UISegmentedControl.appearance().backgroundColor = .clear , а затем просто применить background(Color.red) модификатор к вашему средству выбора. Но я не знаю, как получить доступ к внешнему виду выбранного сегмента в SwiftUI.

5. @JoeScotto Вы нашли решение для изменения цветов строк по отдельности?

Ответ №4:

Я получил желаемые результаты, используя «setTitleTextAttributes»

 UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.white], for: .normal)
  

Я добавил эту строку в метод init() родительского представления.

 public init() {
      UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor(colorManager.p3)], for: .normal)
}

  

Обратите внимание, что вам нужен UIColor, а не цвет SwiftUI