Sobes.tech
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:

  1. Chave (Key): Um tipo que implementa o protocolo PreferenceKey. Define o tipo de valor que será transmitido e como combinar múltiplos valores (reduce mé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)
        }
    }
    
  2. 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)
        })
    
  3. 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:

  • Environment transmite dados para baixo na hierarquia de vistas.
  • PreferenceKey transmite dados para cima e permite coletar/combinar valores de múltiplos elementos filhos.