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:
- 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 (reducemetoda).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) } } - 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) }) - Č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:
Environmentpředává data dolů hierarchií zobrazení.PreferenceKeypředává data nahoru hierarchií zobrazení a umožňuje sběr/sloučení hodnot z několika dceřiných prvků.