İçeriğe geç

ImageRenderer UIKit Destekli View'ları Dışa Aktaramaz

SwiftUI'ın ImageRenderer'ı, List ve ScrollView gibi UIKit veya AppKit kullanarak oluşturulan view'larda sessizce başarısız oluyor.

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.

İşine yaradı mı? Swift ipuçları ve indie geliştirici güncellemeleri için Bluesky ve Mastodon üzerinden takip et.