При сохранении представления SwiftUI в виде изображения содержимое уменьшается и появляется ненужный фон.IOS

Программируем под IOS
Ответить
Гость
 При сохранении представления SwiftUI в виде изображения содержимое уменьшается и появляется ненужный фон.

Сообщение Гость »


Мое представление не имеет черного фона при отображении, но после сохранения его в виде изображения содержимое представления уменьшается, и над ним появляется черный фон.
Просмотр изображения на iPhone
Изображение
Экспорт представления в изображение
Изображение
Вот все код.

Код: Выделить всё

import Foundation
import Photos
import SwiftUI
import UIKit
struct MyImageView: View {
@State private var image: UIImage?
@State var viewWidth = 0.0
@State var viewHeight = 0.0
@ObservedObject var imageSaver = ImageSaver()

var imageUrl = "https://pic.netbian.com/uploads/allimg/160709/215802-1468072682c2c8.jpg"

func calculateSize() {
let maxWidth = UIScreen.main.bounds.width
let maxHeight = UIScreen.main.bounds.height - 100
if maxHeight/maxWidth >= image!.size.height/image!.size.width {
viewWidth = maxWidth
viewHeight = maxWidth * image!.size.height/image!.size.width
} else {
viewHeight = maxHeight
viewWidth = maxHeight/(image!.size.height/image!.size.width)
}
}

private func loadImage() {
URLSession.shared.dataTask(with: URL(string: imageUrl)!) { data, _, error in
guard let data = data, error == nil else {
print("Error loading image: \(error?.localizedDescription ?? "Unknown error")")
return
}

if let uiImage = UIImage(data: data) {
DispatchQueue.main.async {
self.image = uiImage
calculateSize()
}
} else {
print("Failed to create image from data")
}
}.resume()
}

var myView: some View {
ZStack {
if self.image != nil {
Image(uiImage: self.image!)
.resizable()
.frame(width: viewWidth, height: viewHeight)
}
Text("hello girl").font(.title).foregroundColor(.red)
}.frame(width: viewWidth, height: viewHeight)
.background(Color.black)
.onAppear {
loadImage()
}
}

var body: some View {
VStack {
myView
Button("save image") {
myView.snapshot { image in
if let image = image {
imageSaver.saveSnapshot(compressedImage: image)
} else {
print("Failed to capture snapshot image.")
}
}
}
}
}
}

extension View {
func snapshot(completion: @escaping (UIImage?) ->  Void) {
let контроллер = UIHostingController(rootView: self)
let view = контроллер.view
view?.translatesAutoresizingMaskIntoConstraints = false
let targetSize = контроллер.view.intrinsicContentSize
view?.bounds = CGRect(origin: .zero, size: targetSize)
view?.backgroundColor = .black
view?.layoutIfNeeded()
let renderer = UIGraphicsImageRenderer(size: targetSize)
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
let image: UIImage = renderer.image { _ in
контроллер.view.drawHierarchy(in: контроллер .view.bounds, afterScreenUpdates: true)
 контроллер.view.removeFromSuperview()
завершение(изображение)
 }

class ImageSaver: NSObject, ObservableObject {
@Published var isPresented = false
@Published var title: String = ""
@Published var message: String = ""< br />
func saveSnapshot(compressedImage: UIImage) {
PHPhotoLibrary.requestAuthorization(for: .addOnly) { status в
статусе переключения {
case .authorized:
UIImageWriteToSavedPhotosAlbum(
compressedImage, self, #selector(self.saveError), nil
)
case .denied:
self.title = NSLocalizedString("access_denied", комментарий: "" )
self.message =
NSLocalizedString("snapshot_saver_1", комментарий: "")
self.isPresented = true
print("доступ запрещен")
case . Limited:
self.title = NSLocalizedString("snapshot_saver_2", комментарий: "")
self.message =
NSLocalizedString("snapshot_saver_1", комментарий: "")
self. isPresented = true
print("только ограниченный доступ")
case .notDetermined:
print("доступ не определен")
case .restricted:
print(" доступ ограничен")
@unknown default:
break
  
@objc func saveError(_ image: UIImage, Ошибка DidFinishSavingWithError: Ошибка?, contextInfo: UnsafeRawPointer) {
isPresented = true
if error != nil {
title = "failed"
message = "не удалось сохранить изображение"

} else {
title = "успех"
message = "сохранение изображения успешно"
 >

#Preview {
MyImageView()
}

Чтобы обеспечить идеальную согласованность между отображаемым видом и экспортированного изображения, я зафиксировал ширину и высоту изображения.


Источник: https://stackoverflow.com/questions/781 ... re-is-an-u
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»