【问题标题】:Swift - UIImagePickerController - how to use it?Swift - UIImagePickerController - 如何使用它?
【发布时间】:2014-08-28 19:50:12
【问题描述】:

我正在努力理解它是如何工作的,但这对我来说很难。 =) 我有 1 个视图,有一个按钮和一个用于预览的小 ImageView 区域。 按钮触发 imagepickercontroller,UIView 将显示拾取的图像。 没有错误,但图像未显示在 UIImageView 区域中。

var imagePicker = UIImagePickerController()
@IBOutlet var imagePreview : UIImageView

@IBAction func AddImageButton(sender : AnyObject) {
    imagePicker.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
    imagePicker.delegate = self
    self.presentModalViewController(imagePicker, animated: true)

}
func imagePickerController(picker: UIImagePickerController!, didFinishPickingMediaWithInfo info:NSDictionary!) {
    var tempImage:UIImage = info[UIImagePickerControllerOriginalImage] as UIImage
    imagePreview.image  = tempImage

    self.dismissModalViewControllerAnimated(true)

}

func imagePickerControllerDidCancel(picker: UIImagePickerController!) {

    self.dismissModalViewControllerAnimated(true)
}

【问题讨论】:

  • 您是否以编程方式创建 imagePreView?如果它存在于 XIB 或故事板中,请检查您是否已连接 IBOutlet。
  • 请分享imagePreview的初始化代码?
  • 哎呀,一些间距错误。我更正了示例代码。我使用了故事板并为它连接了 IBOutlet。
  • 对于一些赶时间的人:stackoverflow.com/a/55781021/6330448

标签: ios swift xcode cocoa-touch uiimagepickercontroller


【解决方案1】:

您正在抓取一个名为 UIImagePickerControllerOriginalImageUIImage,但不存在这样的图像。你的意思是从editingInfo 字典中用键UIImagePickerControllerOriginalImage 获取UIImage

let tempImage = editingInfo[UIImagePickerControllerOriginalImage] as! UIImage

【讨论】:

  • 谢谢。但现在我遇到了致命错误:Can't unwrap Optional.None
  • 在你要我添加的那一行。你知道这是什么意思吗?
  • 这意味着editingInfonil(我不这么认为),或者字典中不存在UIImagePickerControllerOriginalImage。您正在实现一个旧方法,您应该实现 imagePickerController:didFinishPickingMediaWithInfo: 而不是 imagePickerController:didFinishPickingImage:editingInfo:
  • 谢谢杰斯珀。我按照您所说的更改代码后修复了它。我更新了代码。
  • 是的,我做到了!再次感谢。我编辑了上面的代码,所以代码可以工作了!
【解决方案2】:
import MobileCoreServices

class SecondViewController: UIViewController,UINavigationControllerDelegate, UIImagePickerControllerDelegate {

   @IBOutlet var img:UIImageView!=nil

   override func viewDidLoad() {
        super.viewDidLoad()
   }

   override func didReceiveMemoryWarning() 
   {
       super.didReceiveMemoryWarning()

   }

   @IBAction func buttonTapped(AnyObject)
   {
     if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary){
            println("Button capture")
            var imag = UIImagePickerController()
            imag.delegate = self
            imag.sourceType = UIImagePickerControllerSourceType.PhotoLibrary;
            //imag.mediaTypes = [kUTTypeImage];
            imag.allowsEditing = false
            self.presentViewController(imag, animated: true, completion: nil)
        }
   }

   func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) {
        let selectedImage : UIImage = image
       //var tempImage:UIImage = editingInfo[UIImagePickerControllerOriginalImage] as UIImage
        img.image=selectedImage
        self.dismissViewControllerAnimated(true, completion: nil)    
   }
 }

【讨论】:

【解决方案3】:

试试这个:

func imagePickerController(picker: UIImagePickerController!, didFinishPickingMediaWithInfo info:NSDictionary!) {
    let tempImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    imagePreview.image  = tempImage

或者您也可以使用? 代替!

【讨论】:

    【解决方案4】:

    详情

    • Xcode 11.4.1 (11E503a)、Swift 5.2

    更多

    How to build own photo picker

    解决方案

    import UIKit
    import AVFoundation
    import Photos
    
    protocol ImagePickerDelegate: class {
        func imagePicker(_ imagePicker: ImagePicker, grantedAccess: Bool,
                         to sourceType: UIImagePickerController.SourceType)
        func imagePicker(_ imagePicker: ImagePicker, didSelect image: UIImage)
        func cancelButtonDidClick(on imageView: ImagePicker)
    }
    
    class ImagePicker: NSObject {
    
        private weak var controller: UIImagePickerController?
        weak var delegate: ImagePickerDelegate? = nil
    
        func dismiss() { controller?.dismiss(animated: true, completion: nil) }
        func present(parent viewController: UIViewController, sourceType: UIImagePickerController.SourceType) {
            let controller = UIImagePickerController()
            controller.delegate = self
            controller.sourceType = sourceType
            self.controller = controller
            DispatchQueue.main.async {
                viewController.present(controller, animated: true, completion: nil)
            }
        }
    }
    
    // MARK: Get access to camera or photo library
    
    extension ImagePicker {
    
        private func showAlert(targetName: String, completion: ((Bool) -> Void)?) {
            DispatchQueue.main.async { [weak self] in
                guard let self = self else { return }
                let alertVC = UIAlertController(title: "Access to the \(targetName)",
                                                message: "Please provide access to your \(targetName)",
                                                preferredStyle: .alert)
                alertVC.addAction(UIAlertAction(title: "Settings", style: .default, handler: { action in
                    guard   let settingsUrl = URL(string: UIApplication.openSettingsURLString),
                            UIApplication.shared.canOpenURL(settingsUrl) else { completion?(false); return }
                    UIApplication.shared.open(settingsUrl, options: [:]) { [weak self] _ in
                        self?.showAlert(targetName: targetName, completion: completion)
                    }
                }))
                alertVC.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { _ in completion?(false) }))
                UIApplication.shared.windows.filter { $0.isKeyWindow }.first?
                    .rootViewController?.present(alertVC, animated: true, completion: nil)
            }
        }
    
        func cameraAsscessRequest() {
            if delegate == nil { return }
            let source = UIImagePickerController.SourceType.camera
            if AVCaptureDevice.authorizationStatus(for: .video) ==  .authorized {
                delegate?.imagePicker(self, grantedAccess: true, to: source)
            } else {
                AVCaptureDevice.requestAccess(for: .video) { [weak self] granted in
                    guard let self = self else { return }
                    if granted {
                        self.delegate?.imagePicker(self, grantedAccess: granted, to: source)
                    } else {
                        self.showAlert(targetName: "camera") { self.delegate?.imagePicker(self, grantedAccess: $0, to: source) }
                    }
                }
            }
        }
    
        func photoGalleryAsscessRequest() {
            PHPhotoLibrary.requestAuthorization { [weak self] result in
                guard let self = self else { return }
                let source = UIImagePickerController.SourceType.photoLibrary
                if result == .authorized {
                    DispatchQueue.main.async { [weak self] in
                        guard let self = self else { return }
                        self.delegate?.imagePicker(self, grantedAccess: result == .authorized, to: source)
                    }
                } else {
                    self.showAlert(targetName: "photo gallery") { self.delegate?.imagePicker(self, grantedAccess: $0, to: source) }
                }
            }
        }
    }
    
    // MARK: UINavigationControllerDelegate
    
    extension ImagePicker: UINavigationControllerDelegate { }
    
    // MARK: UIImagePickerControllerDelegate
    
    extension ImagePicker: UIImagePickerControllerDelegate {
    
        func imagePickerController(_ picker: UIImagePickerController,
                                   didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            if let image = info[.editedImage] as? UIImage {
                delegate?.imagePicker(self, didSelect: image)
                return
            }
    
            if let image = info[.originalImage] as? UIImage {
                delegate?.imagePicker(self, didSelect: image)
            } else {
                print("Other source")
            }
        }
    
        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            delegate?.cancelButtonDidClick(on: self)
        }
    }
    

    完全使用

    Info.plist

     <key>NSPhotoLibraryUsageDescription</key>
     <string>bla-bla-bla</string>
     <key>NSCameraUsageDescription</key>
     <string>bla-bla-bla</string>
    

    ViewController (不要忘记粘贴解决方案代码)

    import UIKit
    
    class ViewController: UIViewController {
    
        private weak var imageView: UIImageView!
        private lazy var imagePicker: ImagePicker = {
            let imagePicker = ImagePicker()
            imagePicker.delegate = self
            return imagePicker
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            navigationItem.leftBarButtonItem = UIBarButtonItem(title: "camera", style: .plain, target: self,
                                                               action: #selector(cameraButtonTapped))
            navigationItem.rightBarButtonItem = UIBarButtonItem(title: "photo", style: .plain, target: self,
                                                               action: #selector(photoButtonTapped))
    
            let imageView = UIImageView(frame: CGRect(x: 40, y: 80, width: 200, height: 200))
            imageView.backgroundColor = .lightGray
            view.addSubview(imageView)
            self.imageView = imageView
        }
    
        @objc func photoButtonTapped(_ sender: UIButton) { imagePicker.photoGalleryAsscessRequest() }
        @objc func cameraButtonTapped(_ sender: UIButton) { imagePicker.cameraAsscessRequest() }
    }
    
    // MARK: ImagePickerDelegate
    
    extension ViewController: ImagePickerDelegate {
    
        func imagePicker(_ imagePicker: ImagePicker, didSelect image: UIImage) {
            imageView.image = image
            imagePicker.dismiss()
        }
    
        func cancelButtonDidClick(on imageView: ImagePicker) { imagePicker.dismiss() }
        func imagePicker(_ imagePicker: ImagePicker, grantedAccess: Bool,
                         to sourceType: UIImagePickerController.SourceType) {
            guard grantedAccess else { return }
            imagePicker.present(parent: self, sourceType: sourceType)
        }
    }
    

    图片






    【讨论】:

    • + 导入“UIKit”
    • @jonye._.jin 我刚刚测试了代码。一切都对我有用。可以发给我更多细节吗?
    【解决方案5】:

    swift 4.2xcode 10 开始,func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) 发生了一些变化。

    在函数头中,infoKey-Section 从

    didFinishPickingMediaWithInfo info: [String : Any]

    didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]

    要获取 originalImage,您现在必须调用:

    let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage

    let image = info[.originalImage] as? UIImage

    查找其他 infoKeys here(editedImage、imageURL 等...)

    【讨论】:

    • 对我不起作用:“类型'UIImagePickerController.InfoKey'(又名'NSString')没有成员'originalImage'”
    【解决方案6】:

    在 Swift 5.2、iOS 14.2 中

    class YourViewController: UIViewController,UINavigationControllerDelegate, UIImagePickerControllerDelegate {
    
    @IBAction func btnTapped(_ sender: Any) {
        let imagePickerController = UIImagePickerController()
        imagePickerController.allowsEditing = false //If you want edit option set "true"
        imagePickerController.sourceType = .photoLibrary
        imagePickerController.delegate = self
        present(imagePickerController, animated: true, completion: nil)
        
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let tempImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
        imgRoom.image  = tempImage
        self.dismiss(animated: true, completion: nil)
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 2017-03-14
      • 2016-05-18
      • 2015-12-23
      • 2017-01-18
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多