Die Einschränkung
SwiftUI’s ImageRenderer ermöglicht es dir, jede SwiftUI View in ein UIImage oder CGImage zu rendern. Es funktioniert gut für reine SwiftUI Views, versagt aber stillschweigend – erzeugt ein leeres oder unvollständiges Bild – wenn der View-Baum Komponenten enthält, die von UIKit oder AppKit unterstützt werden. Das betrifft mehrere häufig verwendete Views:
List(umhüllt UITableView / NSTableView)ScrollView(umhüllt UIScrollView / NSScrollView)TextEditor(umhüllt UITextView / NSTextView)Map(umhüllt MKMapView)
Es gibt weder eine Compiler-Warnung noch einen Runtime-Fehler. Der Renderer erfasst diese Teile der View-Hierarchie einfach nicht.
Der Workaround
Als ich ein listenähnliches Layout als Bild exportieren musste, bestand die Lösung darin, List durch ein reines SwiftUI-Äquivalent aus VStack und manueller Stilisierung zu ersetzen:
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
}Der VStack mit ForEach repliziert die visuelle Struktur einer List, ohne auf UIKit-gestützte Views angewiesen zu sein. Das Hinzufügen von Dividers, Padding und einem Hintergrund erzeugt ein Ergebnis, das für Exportzwecke einer Standard-Liste nahe genug kommt.
Praktischer Ratschlag
Wenn du vorhast, ImageRenderer in deiner App zu verwenden, designe deine exportierbaren Views mit dieser Einschränkung von Anfang an im Hinterkopf. Baue sie aus grundlegenden SwiftUI-Primitiven: Stacks, Text, Shapes und Images. Vermeide jede View, von der du weißt, dass sie ein plattformspezifisches Control umhüllt. Das Render-Ergebnis frühzeitig zu testen erspart die Frustration, später leere Bereiche zu entdecken.
