Middle+
Ce este o PreferenceKey în contextul dezvoltării iOS?
sobes.tech AI
Răspuns de la AI
PreferenceKey este un protocol în SwiftUI care permite transmiterea valorilor din vizualizările copil către sus în ierarhia vizualizărilor. Este utilizat pentru colectarea informațiilor despre dimensiuni, poziții sau alte caracteristici ale vizualizărilor copil, care pot fi folosite în vizualizările părinte pentru decizii de layout sau comportament.
Componente principale:
- Cheie (Key): Un tip care implementează protocolul
PreferenceKey. Definește tipul de valoare care va fi transmis și modul de combinare a mai multor valori (reducemetoda).struct MySizePreferenceKey: PreferenceKey { static var defaultValue: CGSize = .zero // Valoare implicită static func reduce(value: inout CGSize, nextValue: () -> CGSize) { // Logica de combinare a valorilor. // În acest caz, se poate alege dimensiunea maximă sau se poate suma. // Exemplu: value = max(value, nextValue()) // Exemplu pentru sumare: value.width += nextValue().width; value.height += nextValue().height value = nextValue() // Pur și simplu luăm ultima valoare (ca exemplu) } } - Setarea valorii: Vizualizarea copil setează valoarea folosind modificatorul
.preference(key:value:).Text("Salut") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) - Citirea valorii: Vizualizarea părinte citește valoarea colectată folosind modificatorul
.onPreferenceChange.VStack { // Vizualizări copil care stabilesc preferințe Text("Exemplu 1") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) Text("Exemplu 2 lung") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) } .onPreferenceChange(MySizePreferenceKey.self) { size in // Aici se poate folosi dimensiunea agregată print("Dimensiune agregată:", size) }
Când să folosiți:
- Obținerea dimensiunilor elementelor copil pentru un layout adaptiv al părintelui.
- Transmiterea informațiilor despre poziția elementelor.
- Crearea de ancore personalizate.
- Colectarea stării sau proprietăților din mai multe vizualizări copil.
Diferența față de Environment:
Environmenttransmite date în jos în ierarhia vizualizărilor.PreferenceKeytransmite date în sus și permite colectarea/ combinarea valorilor din mai multe elemente copil.