使用图像选择器更新 swift 中的背景图像

Update background image in swift using image picker

我只是试图让用户 select 从他们的库中获取图像,并用它替换默认背景。这一切似乎都有效,直到图像应该被替换,我被相同的默认图像卡住了。

为清楚起见:正在显示图片选择器,允许用户select 一张图片,然后它会被关闭,但不会替换背景图片。

import UIKit

class CharmanderViewController: UIViewController {


@IBOutlet weak var background: UIImageView!
@IBOutlet weak var charmander: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    background.addSubview(charmander)
    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(pan(_ :)))
    charmander.addGestureRecognizer(panGesture)

    let scaleGesture = UIPinchGestureRecognizer(target: self, action: #selector(scale(_ :)))
    charmander.addGestureRecognizer(scaleGesture)
}

@objc func scale (_ sender:UIPinchGestureRecognizer){
    if let view = sender.view {
        view.transform = view.transform.scaledBy(x: sender.scale, y: sender.scale)
    }
    sender.scale = 1.0
}
@objc func pan (_ sender:UIPanGestureRecognizer){
    let translation = sender.translation(in: self.view)
    if let view = sender.view {
        view.center = CGPoint(x: view.center.x + translation.x,
                              y: view.center.y + translation.y)
    }
    sender.setTranslation(CGPoint.zero, in: self.view)

    if sender.state == .began {
        print ("drag started")
    } else if sender.state == .changed {
        print ("dragging")
    } else if sender.state == .ended {
        print ("drag ended")
    }


}

@IBAction func getImage(_ sender: Any) {
    if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self as? UIImagePickerControllerDelegate & UINavigationControllerDelegate 
        imagePicker.sourceType = .photoLibrary
        imagePicker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
        self.present(imagePicker, animated: true, completion: nil)
    }
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    background.image = info[UIImagePickerControllerOriginalImage] as? UIImage
    dismiss(animated: true, completion: nil)
}


@IBAction func Share(_ sender: Any) {
    let renderer = UIGraphicsImageRenderer (size: background.bounds.size)
    let image = renderer.image { context in
        background.drawHierarchy(in: background.bounds, afterScreenUpdates: true)
    }

    let shareViewController = UIActivityViewController(activityItems: [image], applicationActivities: [])
    present (shareViewController, animated: true)
}
}

我试过使用

DispatchQueue.main.async {
    updateYourUI()
}

但我不太明白如何正确编写替换图像的函数。感谢任何帮助。

尝试在文件顶部添加 UIImagePickerControllerDelegate 和 UINavigationControllerDelegate:

class CharmanderViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

并在您的 getImage() 函数中,将 imagePickerController 委托设置为自己:

@IBAction func getImage(_ sender: Any) {
    if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = .photoLibrary
        imagePicker.mediaTypes = 
        UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
        self.present(imagePicker, animated: true, completion: nil)
    }
}

然后在您的 didFinishPickingMediaWithInfo 方法中,检查您是否可以将信息转换为 UIImage:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    guard let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage else {return}
    background.image = originalImage
    dismiss(animated: true, completion: nil)
}