使用 PhotosPicker 从照片库中挑选照片后如何更改多张照片

问题描述 投票:0回答:0

我要实现的是批量给图片加水印的功能。下面是我的代码,我有两个问题,不知道哪里出了问题。

  1. 我从相册里选了两张或多张照片加水印保存回相册后,只有一张照片会加水印。但是我循环了数组以添加所有。我不确定它是否是异步的。尝试在任务中添加 await 但似乎不起作用。
  2. 保存照片后,会有提示,我想访问任务的结果并在提示消息中显示。我不知道该怎么做。

任何人都可以帮助我解决这些问题,我将不胜感激。

import SwiftUI
import PhotosUI

struct BatchAddLogo: View {
    @State private var selectedItems = [PhotosPickerItem]()
    @State private var selectedItemIndex = 0
    
    @State private var yourWatermark = ""
    
    @State private var showingAlert = false
    
    let imageSaver = ImageSaver()
    
    var body: some View {
        VStack {
 
            TextField("Please input your watermark for you photo", text: $yourWatermark)
                .textFieldStyle(.roundedBorder)
                .padding()
                
            
            PhotosPicker(selection: $selectedItems,maxSelectionCount: 9, matching: .images) {
                Label("Select photo", systemImage: "photo")
                    .frame(width: 200,height: 60)
                    .foregroundColor(Constant().fontColor)
                    .background(RoundedRectangle(cornerRadius:10).fill(Constant().backgroundColor))
            }
            .disabled(yourWatermark.isEmpty)
            .onChange(of: selectedItems) { _ in
                Task {
                    for item in selectedItems {
                        if let data = try? await item.loadTransferable(type: Data.self) {
                            if let uiImage = UIImage(data: data) {
                                //add watermark
                                let image = Image(uiImage: uiImage)
                                let watermarkedImage = image.overlay(WatermarkImage(watermarkString: yourWatermark),alignment: .bottomTrailing)
                                //save image
                                let watermarkerUIImage = watermarkedImage.asUIImage()
                                imageSaver.writeToPhotoAlbum(image: watermarkerUIImage)
                                
                            }
                        }
                        selectedItemIndex += 1
                        if selectedItemIndex == selectedItems.count  {
                            showingAlert = true
                        }
                    }
                }
            }
        }
        .alert(isPresented: $showingAlert) {
            Alert(title: Text("Notice"), message: Text(imageSaver.message))
        }
        
    }
}
    

struct WatermarkImage: View {
    var watermarkString: String
    
    var body: some View {
        ZStack {
            Text(watermarkString)
                .font(.system(size: 120))
                .foregroundColor(.white)
                .padding(6)
        }
        .background(Color.black.opacity(0.2))
        .cornerRadius(10.0)
        .padding(6)
    }
}




extension View {
// This function changes our View to UIView, then calls another function
// to convert the newly-made UIView to a UIImage.
    public func asUIImage() -> UIImage {
        let controller = UIHostingController(rootView: self)
        
        controller.view.frame = CGRect(x: 0, y: CGFloat(Int.max), width: 1, height: 1)
        let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene
        scene?.windows.first?.rootViewController?.view.addSubview(controller.view)
        
        let size = controller.sizeThatFits(in: UIScreen.main.bounds.size)
        controller.view.bounds = CGRect(origin: .zero, size: size)
        controller.view.sizeToFit()
        
// here is the call to the function that converts UIView to UIImage: `.asUIImage()`
        let image = controller.view.asUIImage()
        controller.view.removeFromSuperview()
        return image
    }
}

extension UIView {
// This is the function to convert UIView to UIImage
    public func asUIImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

对于问题#1:我预计如果我选择一张或多张照片,每张照片都会添加水印并保存回照片库。

对于问题#2:我预计如果照片保存成功,消息将是:保存成功。否则,消息将是错误的内容。

swift swiftui async-await alert
© www.soinside.com 2019 - 2024. All rights reserved.