Middle+
O que é uma PreferenceKey no contexto do desenvolvimento iOS?
sobes.tech IA
Resposta da IA
PreferenceKey é um protocolo no SwiftUI que permite transmitir valores de vistas filhas para cima na hierarquia de vistas. É usado para coletar informações sobre tamanhos, posições ou outras características das vistas filhas, que podem ser usadas em vistas parentais para tomar decisões de layout ou comportamento.
Componentes principais:
- Chave (Key): Um tipo que implementa o protocolo
PreferenceKey. Define o tipo de valor que será transmitido e como combinar múltiplos valores (reducemétodo).struct MySizePreferenceKey: PreferenceKey { static var defaultValue: CGSize = .zero // Valor padrão static func reduce(value: inout CGSize, nextValue: () -> CGSize) { // Lógica para combinar valores. // Neste caso, pode-se escolher o tamanho máximo ou somar. // Exemplo: value = max(value, nextValue()) // Exemplo para somar: value.width += nextValue().width; value.height += nextValue().height value = nextValue() // Simplesmente pegamos o último valor (como exemplo) } } - Definir valor: A vista filha define o valor usando o modificador
.preference(key:value:).Text("Olá") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) - Ler valor: A vista parental lê o valor coletado usando o modificador
.onPreferenceChange.VStack { // Vistas filhas que definem preferências Text("Exemplo 1") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) Text("Exemplo 2 longo") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) } .onPreferenceChange(MySizePreferenceKey.self) { size in // Aqui, pode-se usar o tamanho agregado print("Tamanho agregado:", size) }
Quando usar:
- Obter tamanhos de elementos filhos para layout adaptativo do pai.
- Transmitir informações sobre a posição dos elementos.
- Criar âncoras personalizadas.
- Coletar estado ou propriedades de várias vistas filhas.
Diferença de Environment:
Environmenttransmite dados para baixo na hierarquia de vistas.PreferenceKeytransmite dados para cima e permite coletar/combinar valores de múltiplos elementos filhos.