ViewModifier, SwiftUI'de View'lerin görünümünü ve davranışını değiştirmek için yeniden kullanılabilir değiştiriciler oluşturmayı sağlayan bir protokoldür. Apple Developer Documentation, 2024'e göre, ViewModifier, orijinal View'i alan ve değiştirilmiş bir View döndüren, yerleşik değiştiricilerin herhangi bir kombinasyonunu tek bir türde kapsülleyen body(content:) yönteminin uygulanmasını gerektirir. Bu protokol olmadan, geliştiriciler her kullanım noktasında aynı değiştirici zincirlerini tekrarlamak zorunda kalırdı.
Önemli noktalar
ViewModifier, herhangi bir View türüne uygulanabilen değiştiriciler oluşturmak için bir sözleşme tanımlayan bir SwiftUI protokolüdür. protocol ViewModifier { associatedtype Body: View; func body(content: Content) -> Body } şeklinde bildirilir; burada Content, değiştiriciye iletilen orijinal View'in türüdür.
ViewModifier protokolü, SwiftUI'nin ilk sürümüyle birlikte iOS 13'te ortaya çıktı ve iOS 18+ dahil olmak üzere kararlı kalmaya devam ediyor. Ana amaç, geliştiricilere tekrarlanan değiştirici zincirlerini tek bir yeniden kullanılabilir türde kapsüllemek için bir mekanizma sağlamaktır. ViewModifier olmadan, aynı stil kümesini her uygulamanız gerektiğinde tüm değiştiricileri manuel olarak tekrarlamanız gerekirdi.
Swift by Sundell (2023)'e göre ViewModifier, aynı değiştirici kümesi üç veya daha fazla yerde kullanıldığında SwiftUI projelerinde stilleri düzenlemenin tercih edilen yoludur. Tek seferlik kombinasyonlar için, doğrudan View üzerinde bir yerleşik değiştirici zinciri yeterlidir.
ViewModifier protokolü, bir body(content:) yönteminin uygulanmasını gerektirir ve isteğe bağlı olarak özel değiştiricinin başlatıcı parametreleri aracılığıyla davranışı özelleştirmek için özellikler sağlayabilir.
ViewModifier protokolü, orijinal View'i (Content türü) alan ve değiştirilmiş bir View (Body türü) döndüren body(content:) yöntemini tanımlar. SwiftUI, değiştiriciyi View'e content olarak ileterek uygular ve sonucu görüntüleme için kullanır.
struct CardStyle: ViewModifier {
func body(content: Content) -> some View {
content
.padding(16)
.background(Color.white)
.cornerRadius(12)
.shadow(radius: 4, x: 0, y: 2)
}
}
// Kullanım:
Text("Merhaba, SwiftUI!")
.modifier(CardStyle())
.modifier(CardStyle()) çağrısını yaptığınızda, SwiftUI orijinal View'i ve değiştiriciyi depolayan bir ModifiedContent<Text, CardStyle> örneği oluşturur. Oluşturma sırasında SwiftUI, CardStyle.body(content: text) çağrısını yaparak padding, background, cornerRadius ve shadow ile değiştirilmiş bir View elde eder.
Önemli ayrım: ViewModifier.body, View her güncellendiğinde çağrılır, bu nedenle body içinde ağır hesaplamalar veya yan etkiler olmamalıdır. Değiştirici harici verilere (state, environment) bağlıysa, bunları başlatıcı parametreleri aracılığıyla iletin.
SwiftUI'nin yerleşik değiştiricileri (font, foregroundColor, frame, padding), ModifiedContent türünü döndüren View protokolünün uzantı yöntemleridir. Doğrudan ViewModifier uygulamazlar — SwiftUI, her yerleşik değiştirici için dahili optimize edilmiş uygulamalar kullanır.
| Özellik | Yerleşik değiştiriciler | Özel ViewModifier |
|---|---|---|
| Uygulama | View uzantı yöntemleri | ViewModifier protokolü |
| Yeniden kullanım | Tek seferlik zincir | Birden çok kullanım |
| Parametreler | Sabit (renk, boyut) | Başlatıcı aracılığıyla herhangi biri |
| Performans | Maksimum (dahili optimizasyonlar) | Biraz daha yüksek ek yük |
| Dönüş türü | ModifiedContent | ModifiedContent |
Özel ViewModifier, aynı değiştirici kombinasyonu iki veya daha fazla yerde kullanıldığında haklıdır. Tek seferlik kullanımlar için doğrudan değiştirici zinciri tercih edilir — kod okunabilir kalır ve derleyici daha iyi optimize eder.
WWDC 2023'e göre Apple, uygulamanın tasarım sistemiyle ilgili stiller için özel ViewModifier oluşturulmasını önerir: kartlar, düğmeler, giriş alanları. Bu, tutarlılık sağlar ve tasarım değiştiğinde bakımı basitleştirir.
Şablon 1: tasarım sistemi kapsüllemesi. ViewModifier'ın en yaygın kullanım durumu, bir uygulamadaki görsel stiller için tek bir doğru kaynağı oluşturmaktır. Her tasarım sistemi öğesi (kart, düğme, başlık) kendi değiştiricisini alır.
struct PrimaryButton: ViewModifier {
var isEnabled: Bool
func body(content: Content) -> some View {
content
.font(.headline.weight(.semibold))
.foregroundColor(.white)
.padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))
.background(isEnabled ? Color.blue : Color.gray)
.cornerRadius(8)
.opacity(isEnabled ? 1.0 : 0.6)
}
}
Şablon 2: koşullu değiştirici uygulaması. Bazen bir değiştiriciyi yalnızca belirli bir koşul altında uygulamanız gerekir. Boolean parametresine sahip bir ViewModifier, bu mantığı body içinde kapsüllemeye izin verir.
Şablon 3: değiştirici kompozisyonu. Bir ViewModifier, kendi body'si içinde başka ViewModifier'lar uygulayabilir. Bu, her birinin görsel sunumun kendi yönünden sorumlu olduğu bir değiştirici hiyerarşisi oluşturmayı sağlar. Örneğin, CardStyle dahili olarak ShadowStyle ve BorderStyle uygulayabilir.
Point-Free (2024)'e göre, ViewModifier aracılığıyla değiştirici kompozisyonu, kalıtıma tercih edilir: her değiştirici bir görevden sorumludur ve bağımsız olarak birleştirilebilirler. Bu, SwiftUI'de tek sorumluluk ilkesini takip eder.
ViewModifier'ın performansı, her uygulamada oluşturulan ModifiedContent sarmalayıcılarının sayısına bağlıdır. SwiftUI, oluşturma aşamasında diffing yoluyla değiştirici zincirlerini optimize eder, ancak aşırı sayıda değiştirici güncellemeleri yavaşlatabilir.
| Değiştirici sayısı | Performans etkisi | Öneri |
|---|---|---|
| 1–5 | Minimum | Herhangi bir View için normal |
| 5–10 | Orta | ViewModifier'da grupla |
| 10–20 | Fark edilir | Tek bir özel değiştiricide birleştir |
| 20+ | Kritik | View mimarisini yeniden düşün |
Optimizasyon: aynı türden birden çok sıralı değiştiriciyi (örneğin birden çok padding) tek bir değiştiricide birleştirin. PreferenceKey'i yalnızca gerçekten gerekli olduğunda kullanın — tercihleri okuyan değiştiriciler ek bir oluşturma geçişini tetikler.
Temel kural: bir View'de 10'dan fazla değiştirici varsa — bunlardan bazılarını özel bir ViewModifier'a çıkarın. Bu, okunabilirliği artıracak ve SwiftUI'nin güncellemeleri optimize etmesine izin verecektir. SwiftUI Lab (2024)'e göre, değiştiricileri bir ViewModifier'da gruplamak, karmaşık View'ler için oluşturma süresini %15–30 oranında azaltır.
Sıkça sorulan sorular
ViewModifier, bir View'in görünümünü veya davranışını değiştiren yeniden kullanılabilir değiştiriciler oluşturmak için bir protokoldür. body(content:) yönteminin uygulanmasını gerektirir, orijinal View'i alır ve değiştirilmiş bir View döndürür.
Yerleşik değiştiriciler (font, padding), dahili optimize edilmiş uygulamaları kullanan View protokolünün uzantı yöntemleridir. ViewModifier, yerleşiklerin bir kombinasyonunu kapsülleyen ve başlatıcı parametrelerine sahip olabilen özel değiştiriciler için bir protokoldür.
Aynı değiştirici kombinasyonu üç veya daha fazla yerde kullanıldığında özel bir ViewModifier oluşturun. Tek seferlik zincirler için doğrudan View üzerinde değiştiriciler kullanın — daha basit ve daha verimlidir.
Evet, ViewModifier @State veya @Environment özellikleri içerebilir. SwiftUI, yaşam döngülerini View ile aynı şekilde yönetir. Ancak, body'nin her güncellemede çağrıldığını unutmayın, bu nedenle değiştirici gövdesinde ağır işlemlerden kaçının.
@ViewBuilder içinde if/else kullanın veya body içinde koşullu olarak değişiklikleri uygulayan veya atlayan boolean parametresine sahip bir değiştirici oluşturun. Örneğin, yukarıdaki PrimaryButton, koşullu stil uygulaması için isEnabled kullanır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun