ios Swift - UIImagePickerController - 如何使用它?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24625687/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 01:15:26  来源:igfitidea点击:

Swift - UIImagePickerController - how to use it?

iosswiftuiimagepickercontroller

提问by user3806731

I am trying hard to understand how this works, but it's pretty hard for me. =) I have 1 view, there is one button and one small ImageView area for preview. The button triggers imagepickercontroller, and the UIView will display picked image. There is no error but the image doesn't show in the UIImageView area.

我正在努力理解这是如何工作的,但这对我来说很难。=) 我有 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)
}

采纳答案by Jesper

You're grabbing a UIImagenamed UIImagePickerControllerOriginalImageand there exists no such image. You're meant to grab the UIImagewith the key UIImagePickerControllerOriginalImagefrom the editingInfodictionary:

您正在抓取一个UIImage命名UIImagePickerControllerOriginalImage并且不存在这样的图像。你注定要抓住UIImage用钥匙UIImagePickerControllerOriginalImageeditingInfo词典:

let tempImage = editingInfo[UIImagePickerControllerOriginalImage] as! UIImage

回答by Varsha Vijayvargiya

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)    
   }
 }

回答by Vasily Bodnarchuk

Details

细节

  • Xcode 11.4.1 (11E503a), Swift 5.2
  • Xcode 11.4.1 (11E503a),Swift 5.2

More

更多的

How to build own photo picker

如何构建自己的照片选择器

Solution

解决方案

import AVFoundation
import Photos
import UIKit

protocol ImagePickerDelegate: class {
    func imagePickerDelegate(canUseCamera accessIsAllowed: Bool, delegatedForm: ImagePicker)
    func imagePickerDelegate(canUseGallery accessIsAllowed: Bool, delegatedForm: ImagePicker)
    func imagePickerDelegate(didSelect image: UIImage, delegatedForm: ImagePicker)
    func imagePickerDelegate(didCancel delegatedForm: ImagePicker)
}

class ImagePicker: NSObject {

    private weak var controller: UIImagePickerController?
    weak var delegate: ImagePickerDelegate? = 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)
        }
    }

    func dismiss() { controller?.dismiss(animated: true, completion: nil) }
}

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 {
 <key>NSPhotoLibraryUsageDescription</key>
 <string>bla-bla-bla</string>
 <key>NSCameraUsageDescription</key>
 <string>bla-bla-bla</string>
.isKeyWindow}.first?.rootViewController?.present(alertVC, animated: true, completion: nil) } } func cameraAsscessRequest() { if AVCaptureDevice.authorizationStatus(for: .video) == .authorized { delegate?.imagePickerDelegate(canUseCamera: true, delegatedForm: self) } else { AVCaptureDevice.requestAccess(for: .video) { [weak self] granted in guard let self = self else { return } if granted { self.delegate?.imagePickerDelegate(canUseCamera: granted, delegatedForm: self) } else { self.showAlert(targetName: "camera") { self.delegate?.imagePickerDelegate(canUseCamera:
import "UIKit
class ViewController: UIViewController {

    private lazy var imagePicker = ImagePicker()
    private weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        imagePicker.delegate = self

        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
    }

    private func presentImagePicker(sourceType: UIImagePickerController.SourceType) {
        imagePicker.present(parent: self, sourceType: sourceType)
    }

    @objc func photoButtonTapped(_ sender: UIButton) { imagePicker.photoGalleryAsscessRequest() }
    @objc func cameraButtonTapped(_ sender: UIButton) { imagePicker.cameraAsscessRequest() }
}

extension ViewController: ImagePickerDelegate {

    func imagePickerDelegate(didSelect image: UIImage, delegatedForm: ImagePicker) {
        imageView.image = image
        imagePicker.dismiss()
    }

    func imagePickerDelegate(didCancel delegatedForm: ImagePicker) { imagePicker.dismiss() }

    func imagePickerDelegate(canUseGallery accessIsAllowed: Bool, delegatedForm: ImagePicker) {
        if accessIsAllowed { presentImagePicker(sourceType: .photoLibrary) }
    }

    func imagePickerDelegate(canUseCamera accessIsAllowed: Bool, delegatedForm: ImagePicker) {
        // works only on real device (crash on simulator)
        if accessIsAllowed { presentImagePicker(sourceType: .camera) }
    }
}
, delegatedForm: self) } } } } } func photoGalleryAsscessRequest() { PHPhotoLibrary.requestAuthorization { [weak self] result in guard let self = self else { return } if result == .authorized { DispatchQueue.main.async { [weak self] in guard let self = self else { return } self.delegate?.imagePickerDelegate(canUseGallery: result == .authorized, delegatedForm: self) } } else { self.showAlert(targetName: "photo gallery") { self.delegate?.imagePickerDelegate(canUseCamera:
func imagePickerController(picker: UIImagePickerController!, didFinishPickingMediaWithInfo info:NSDictionary!) {
    let tempImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    imagePreview.image  = tempImage
, delegatedForm: self) } } } } } extension ImagePicker: UIImagePickerControllerDelegate, UINavigationControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let image = info[.editedImage] as? UIImage { delegate?.imagePickerDelegate(didSelect: image, delegatedForm: self) return } if let image = info[.originalImage] as? UIImage { delegate?.imagePickerDelegate(didSelect: image, delegatedForm: self) } else { print("Other source") } } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { delegate?.imagePickerDelegate(didCancel: self) } }

Full Usage

完全使用

Info.plist

信息表

##代码##

ViewController (do not forget to paste solution code)

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

##代码##

Images

图片

enter image description here

在此处输入图片说明



enter image description here

在此处输入图片说明



enter image description here

在此处输入图片说明



enter image description here

在此处输入图片说明



enter image description here

在此处输入图片说明



enter image description here

在此处输入图片说明

回答by andre_hold

Since swift 4.2and xcode 10the func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])change a bit.

swift 4.2xcode 10 开始func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])变化有点大。

at the function header the infoKey-Section changes from

在函数头处,infoKey-Section 从

didFinishPickingMediaWithInfo info: [String : Any]to

didFinishPickingMediaWithInfo info: [String : Any]

didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]

didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]

To get the originalImage you now have to call:

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

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

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

let image = info[.originalImage] as? UIImage

let image = info[.originalImage] as? UIImage

find other infoKeys here(editedImage, imageURL and more...)

在此处查找其他信息键(editedImage、imageURL 等...)

回答by Gaurav

Try this:

尝试这个:

##代码##

or you can also use ?in place of !.

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