TGViewer
Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck @mobileproglib · 9.17K subscribers
Post #7128 613
🎮 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
More from @mobileproglib
  1. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  2. Sep 15, 2026🖥 Наглядная шпаргалка по операторам Combine Внутри: описанием распространенных операторов…
  3. Sep 13, 2026🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy выра…
  4. Sep 13, 2026🤪 Если бы можно было задать один вопрос про AI в разработке — что бы вы спросили? Как выб…
  5. Sep 9, 2026🤳 Как работает мобильная разработка с AI под капотом — интенсивы от Podlodka Crew Конфере…
  6. Aug 8, 2026⚙️ Kinetics — настраиваемые примитивы физического движения для SwiftUI Kinetics привносит…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →