🎮
Image Playground Sheet в SwiftUI: как заменить ImageCreatorКогда Image Playground только появился, у разработчиков было два пути: показывать системный интерфейс или генерировать изображения программно через
ImageCreator. Второй путь закрывается — Apple объявила
ImageCreator deprecated. В iOS 27+ он перестанет работать.
Рекомендуемая альтернатива — системный модификатор
imagePlaygroundSheet для SwiftUI.
🔹
Что делает imagePlaygroundSheetЭто модификатор, который показывает системный интерфейс Image Playground из вашего приложения. Вы даёте начальную идею (текст, структурированные концепты, опционально исходное изображение), а пользователь внутри шеста создаёт, редактирует и выбирает готовую картинку.
Важно: ваше приложение
не отправляет промт и не получает готовое изображение без участия пользователя. Вы запускаете поток, пользователь работает внутри шеста, приложение получает результат. Это соответствует стратегии Apple: генерация изображений — управляемый пользователем процесс.
🔹 Базовое использованиеimport SwiftUI
import ImagePlayground
struct ContentView: View {
@State private var isPresented = false
@State private var generatedImageURL: URL?
var body: some View {
VStack(spacing: 16) {
if let generatedImageURL {
AsyncImage(url: generatedImageURL) { image in
image.resizable().scaledToFit()
} placeholder: {
ProgressView()
}
}
Button("Create image") {
isPresented = true
}
}
.imagePlaygroundSheet(
isPresented: $isPresented,
concept: "A small robot reading a Swift book",
sourceImage: nil,
onCompletion: { url in
generatedImageURL = url
},
onCancellation: {
print("Cancelled")
}
)
}
}
Модификатор ведёт себя как стандартные API презентации SwiftUI: вы управляете через биндинг, SwiftUI показывает шест, когда он
true.
🔹
URL временный, нужно сохранятьURL, возвращаемый в
onCompletion, указывает на
временный файл. Для быстрого превью это ок, но если изображение становится частью данных приложения (аватар, иллюстрация, стикер, обложка) — его нужно сохранить.
private func persistGeneratedImage(from temporaryURL: URL) throws -> URL {
let fileName = "\(UUID().uuidString).png"
let destinationURL = URL.documentsDirectory.appending(path: fileName)
try FileManager.default.copyItem(at: temporaryURL, to: destinationURL)
return destinationURL
}
.imagePlaygroundSheet(
isPresented: $isPresented,
concept: "A small robot reading a Swift book",
sourceImage: nil,
onCompletion: { temporaryURL in
do {
generatedImageURL = try persistGeneratedImage(from: temporaryURL)
} catch {
print("Failed to save:", error)
}
},
onCancellation: {
print("Cancelled")
}
)Лучше выносить логику сохранения за пределы вью — отдельный объект, решающий, где сохранять, как называть и как встраивать в модель данных.
🔹 Проверка доступностиImage Playground доступен не везде. Зависит от версии ОС, устройства, Apple Intelligence и настроек пользователя. SwiftUI предоставляет окружение:
@Environment(\.supportsImagePlayground) private var supportsImagePlayground
var body: some View {
if supportsImagePlayground {
Button("Create image") { isPresented = true }
} else {
Text("Image Playground is not available")
}
}
🔹
Передача исходного изображенияИсходное изображение меняет сценарий: от «создай из текста» к «создай на основе этого».
.imagePlaygroundSheet(
isPresented: $isPresented,
concept: "Turn this into a soft illustrated avatar",
sourceImage: selectedImage,
onCompletion: { url in
generatedImageURL = url
}
)
Но помните: Image Playground — это интерактивный системный интерфейс. Исходное изображение даёт пользователю стартовую точку, а не строгий пайплайн трансформации.
🔹
Несколько концептов для большего контекстаПростая строка подходит для простых случаев, но Image Playground поддерживает структурированные концепты:
let concepts: [ImagePlaygroundConcept] = [
.text("Birthday postcard"),
.text("Warm evening light"),
.extracted(from: messageText, title: "Message")
]
.imagePlaygroundSheet(
isPresented: $isPresented,
concepts: concepts,
sourceImage: nil,
onCompletion: { url in
generatedImageURL = url
},
onCancellation: {
print("Cancelled")
}
)
Это полезно, когда идея для изображения собирается из нескольких частей приложения.
🔹
ИтогimagePlaygroundSheet — это не просто удобный модификатор. После deprecation
ImageCreator он становится основным Apple-рекомендованным путём для приложений, которые хотят использовать Image Playground внутри своего интерфейса.
Вы даёте контекст — система показывает интерфейс создания — пользователь выбирает финальное изображение.
Если ваше приложение использовало
ImageCreator, сейчас время пересмотреть эту фичу. Некоторые продукты могут перейти на
imagePlaygroundSheet с небольшими изменениями UI. Другим, возможно, понадобится альтернативный сервис генерации изображений.
📌
Лучшие вакансии для мобильных разработчиков
🐸 Библиотека мобильного разработчика#PixelPerfect #Swift