Sobes.tech
Middle+

iOS geliştirme bağlamında PreferenceKey nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

PreferenceKey SwiftUI'da, çocuk görünümlerden yukarıya doğru değerleri iletmeye olanak tanıyan bir protokoldür. Boyutlar, konumlar veya diğer özellikler hakkında bilgi toplamak için kullanılır ve bu bilgiler, düzen veya davranış kararları almak için ebeveyn görünümlerde kullanılabilir.

Ana bileşenler:

  1. Anahtar (Key): PreferenceKey protokolünü uygulayan bir türdür. İletilecek değer türünü ve birden fazla değeri nasıl birleştireceğini (reduce yöntemi) belirler.
    struct MySizePreferenceKey: PreferenceKey {
        static var defaultValue: CGSize = .zero // Varsayılan değer
    
        static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
            // Değerleri birleştirme mantığı.
            // Bu durumda, maksimum boyutu seçebilir veya toplayabiliriz.
            // Örnek: value = max(value, nextValue())
            // Toplama örneği: value.width += nextValue().width; value.height += nextValue().height
             value = nextValue() // Sadece son değeri alıyoruz (örnek olarak)
        }
    }
    
  2. Değeri ayarla: Çocuk görünüm, .preference(key:value:) modifikatorü ile değeri ayarlar.
    Text("Merhaba")
        .background(GeometryReader { geometry in
            Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
        })
    
  3. Değeri oku: Ebeveyn görünüm, toplanan değeri .onPreferenceChange modifikatorü ile okur.
    VStack {
        // Tercihleri ayarlayan çocuk görünümler
        Text("Örnek 1")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    
        Text("Örnek 2 uzun")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    }
    .onPreferenceChange(MySizePreferenceKey.self) { size in
        // Burada toplanan boyut kullanılabilir
        print("Toplam boyut:", size)
    }
    

Ne zaman kullanılır:

  • Çocuk öğelerin boyutlarını almak ve ebeveynin uyumlu düzenini sağlamak.
  • Öğelerin konum bilgilerini iletmek.
  • Özel çapa noktaları (anchors) oluşturmak.
  • Birden fazla çocuk görünümden durum veya özellikleri toplamak.

Environment ile farkı:

  • Environment, verileri aşağı doğru iletir.
  • PreferenceKey, verileri yukarı doğru iletir ve birden fazla çocuk öğeden değerleri toplama/ birleştirme imkanı sağlar.