Sobes.tech
Middle+

Co je PreferenceKey v kontextu vývoje na iOS?

sobes.tech AI

Odpověď od AI

PreferenceKey je protokol ve SwiftUI, který umožňuje předávat hodnoty z dceřiných zobrazení vzhůru po hierarchii zobrazení. Používá se ke sběru informací o velikostech, poloze nebo jiných vlastnostech dceřiných zobrazení, které lze použít v rodičovských zobrazeních pro rozhodování o rozložení nebo chování.

Hlavní komponenty:

  1. Klíč (Key): Typ, který implementuje protokol PreferenceKey. Určuje typ hodnoty, která bude předávána, a způsob sloučení více hodnot (reduce metoda).
    struct MySizePreferenceKey: PreferenceKey {
        static var defaultValue: CGSize = .zero // Výchozí hodnota
    
        static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
            // Logika sloučení hodnot.
            // V tomto případě lze zvolit maximální velikost nebo sčítat.
            // Příklad: value = max(value, nextValue())
            // Příklad pro sčítání: value.width += nextValue().width; value.height += nextValue().height
             value = nextValue() // Jednoduše vezmeme poslední hodnotu (pro příklad)
        }
    }
    
  2. Nastavení hodnoty: Dceřiné zobrazení nastaví hodnotu pomocí modifikátoru .preference(key:value:).
    Text("Ahoj")
        .background(GeometryReader { geometry in
            Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
        })
    
  3. Čtení hodnoty: Rodičovské zobrazení čte sesbíranou hodnotu pomocí modifikátoru .onPreferenceChange.
    VStack {
        // Dceřiná zobrazení nastavující preference
        Text("Příklad 1")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    
        Text("Dlouhý příklad")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    }
    .onPreferenceChange(MySizePreferenceKey.self) { size in
        // Zde lze použít agregovanou velikost
        print("Agregovaná velikost:", size)
    }
    

Kdy použít:

  • Získání velikostí dceřiných prvků pro adaptivní rozložení rodiče.
  • Přenos informací o umístění prvků.
  • Vytváření vlastních kotev (anchors).
  • Sběr stavu nebo vlastností z několika dceřiných zobrazení.

Rozdíl od Environment:

  • Environment předává data dolů hierarchií zobrazení.
  • PreferenceKey předává data nahoru hierarchií zobrazení a umožňuje sběr/sloučení hodnot z několika dceřiných prvků.