Kısıtlama
SwiftUI’ın ImageRenderer‘ı herhangi bir SwiftUI view’ını UIImage veya CGImage‘a dönüştürmeye olanak tanıyor. Saf SwiftUI view’larında iyi çalışıyor, ama view ağacında UIKit veya AppKit tarafından desteklenen bileşenler olduğunda sessizce başarısız oluyor – boş veya eksik bir görsel üretiyor. Bu, yaygın olarak kullanılan birçok view’ı kapsıyor:
List(UITableView / NSTableView sarmalıyor)ScrollView(UIScrollView / NSScrollView sarmalıyor)TextEditor(UITextView / NSTextView sarmalıyor)Map(MKMapView sarmalıyor)
Herhangi bir derleyici uyarısı veya çalışma zamanı hatası yok. Renderer sadece view hiyerarşisinin o kısımlarını yakalamıyor.
Geçici Çözüm
Liste benzeri bir düzeni görsel olarak export etmem gerektiğinde, çözüm List’i VStack ve manuel stillendirmeden oluşan saf bir SwiftUI karşılığıyla değiştirmek oldu:
let exportView = VStack(spacing: 0) {
ForEach(items) { item in
HStack {
Text(item.name)
Spacer()
Text(item.value)
.foregroundStyle(.secondary)
}
.padding(.horizontal, 16)
.padding(.vertical, 12)
if item.id != items.last?.id {
Divider()
}
}
}
.background(.white)
.frame(width: 390)
let renderer = ImageRenderer(content: exportView)
renderer.scale = UIScreen.main.scale
if let image = renderer.uiImage {
// Use the rendered image
}ForEach ile VStack, UIKit destekli herhangi bir view’a bağlı kalmadan List’in görsel yapısını kopyalıyor. Ayırıcılar, dolgu ve arka plan eklemek, export amaçları için standart bir listeye yeterince yakın bir sonuç üretiyor.
Pratik Tavsiye
Uygulamanda ImageRenderer kullanmayı planlıyorsan, export edilecek view’larını en başından bu kısıtlamayı göz önünde bulundurarak tasarla. Bunları temel SwiftUI bileşenlerinden oluştur: stack’ler, metin, şekiller ve görseller. Platform-özel bir kontrolü sardığını bildiğin herhangi bir view’dan kaçın. Render çıktısını erken test etmek, daha sonra boş bölgeler keşfetmenin hayal kırıklığından kurtarıyor.
