Kann ich Modifier daran hindern, sich mit dem Dark-, oder Light-Mode zu ändern?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Kann ich Modifier daran hindern, sich mit dem Dark-, oder Light-Mode zu ändern?

    Hallo,

    ich habe ein dunkles Hintergrundbild und möchte deshalb z.B. den navigationTitle in einem NavigationStack gerne weiß haben. Dies geht aber nur, wenn ich .preferredColorScheme(.dark) setze.
    Auf dem dunklen Hintergrundbild habe ich jetzt ein VStack mit Elementen mit diesem Modifier: .background(.regularMaterial). Gibt es eine Möglichkeit, diesen Modifier daran zu hindern, dunkel zu werden, wenn ich das Scheme auf .dark setze?

    Danke!
  • Das hatte ich schon probiert, liefert aber: Member 'regularMaterial' in 'Color' produces result of type 'Material', but context expects 'Color'

    Ich habe mein ganzes - aber noch unfertiges - Projekt jetzt mal auf Github: github.com/Martius108/sun_moon

    Das ist aber eine Menge Code und deshalb hier exemplarisch die eine Datei, welche eine Liste von Städten anzeigt -> preferredColorScheme(.dark) führt dazu, dass der NavigationStack Title weiß wird, wie gewünscht, dafür wird jetzt .regularMaterial dunkel und die Schrift darüber weiß, was nicht gewünscht ist.
    In diesem Fall wäre es auch eine Option, den NavigationStack Title zu modifizieren, falls das geht. Auf direktem Weg (modifier) geht es jedenfalls nicht, aber vielleicht über colorScheme oder eine Extension?

    Quellcode

    1. import SwiftUI
    2. import WeatherKit
    3. struct CitiesListView: View {
    4. // use dismiss to remove a view from a NavigationStack
    5. @Environment(\.dismiss) private var dismiss
    6. @Environment(\.colorScheme) var colorScheme
    7. let currentLocation: City?
    8. @Binding var selectedCity: City?
    9. var body: some View {
    10. NavigationStack {
    11. List {
    12. Group {
    13. if let currentLocation {
    14. CityRowView(city: currentLocation)
    15. .onTapGesture {
    16. selectedCity = currentLocation
    17. dismiss()
    18. }
    19. }
    20. ForEach(City.cities) { city in
    21. CityRowView(city: city)
    22. .onTapGesture {
    23. selectedCity = city
    24. dismiss()
    25. }
    26. }
    27. }
    28. .frame(maxWidth: 0.95 * UIScreen.main.bounds.width)
    29. .padding(.vertical, 2)
    30. .background(.regularMaterial)
    31. .clipShape(.rect(cornerRadius: 20))
    32. .listRowBackground(Color.clear)
    33. .scrollContentBackground(.hidden)
    34. }
    35. .listStyle(.plain)
    36. .navigationTitle("My Cities")
    37. .navigationBarTitleDisplayMode(.inline)
    38. .preferredColorScheme(.dark)
    39. //.background(colorScheme == .dark ? Color.clear : .regularMaterial)
    40. .background {
    41. Image(.image2)
    42. }
    43. }
    44. }
    45. }
    46. #Preview {
    47. CitiesListView(currentLocation: City.mockCurrent, selectedCity: .constant(nil))
    48. .environment(LocationManager())
    49. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Vetinari108 ()

  • mihema schrieb:

    anstelle von .whatEver schreibst du einfach .regularMaterial


    Quellcode

    1. .background(colorScheme == .dark ? Color.clear : .regularMaterial)
    Poste doch mal den ganzen View.
    Das funktioniert leider nicht. Mit dem ternary muss es der gleiche Type sein.
    Stattdessen kannst du


    Quellcode

    1. .background {
    2. if colorScheme == .dark {
    3. Color.clear
    4. } else {
    5. Rectangle().fill(.regularMaterial)
    6. }
    7. }
    als Workaround nehmen.
  • Hmm, ich habe das eigentlich schon gemacht und mein Image jetzt direkt hier eingebaut:

    Quellcode

    1. .preferredColorScheme(.dark)
    2. .background {
    3. if colorScheme == .dark {
    4. Rectangle().fill(.regularMaterial)
    5. Image(.image1)
    6. .resizable()
    7. .scaledToFill()
    8. .ignoresSafeArea(.all)
    9. } else {
    10. Color.clear
    11. Image(.image1)
    12. .resizable()
    13. .scaledToFill()
    14. .ignoresSafeArea(.all)
    15. }
    16. }
    Alles anzeigen
    klappt aber noch nicht. Habe ich irgendwas übersehen?