web-dev-qa-db-fra.com

comment capturer la caméra avec UIImagePickerController en rapide?

J'essaie d'utiliser UIImagePickerController dans Swift mais ce n'est pas du travail ...

mon ViewController:

class ViewController: UIViewController {

@IBOutlet var imag : UIView = nil
@IBAction func capture(sender : UIButton) {
    println("Button capture")
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)
    {
        var imag = UIImagePickerController()
        imag.delegate = self
        imag.sourceType = UIImagePickerControllerSourceType.Camera;
       imag.mediaTypes = kUTTypeImage
        imag.allowsEditing = false

        self.presentViewController(imag, animated: true, completion: nil)

    }
   }   
}

J'ai des erreurs dans la ligne de code suivante

imag.delegate = self 
(Type'ViewControlles does confoorm to protocol 'UIImagePickerControllerDelegate')
imagePicker.mediaTypes = kUTTypeImage   
(use of unresolved identifier kUTTypeImage)

J'ai lu que kUTTypeImage ne peut pas être utilisé dans Swift. Mais je ne sais pas, j'utilise mal cette fonction. De l'aide?

Merci!!

33
user3745888

Vous devez également importer MobileCoreServices dans le contrôleur:

import MobileCoreServices 

puis mettez le type entre crochets comme ceci:

image.mediaTypes = [kUTTypeImage]

Swift 2.0 et supérieur

image.mediaTypes = [kUTTypeImage as String]
82
Filippo Camillo

Swift 2.0

Dans Swift 2.0 (Xcode 7), vous devez explicitement transtyper kUTTypeImage (a CFString) en String:

picker.mediaTypes = [kUTTypeImage as String]

Et vous devez toujours importer Mobile Core Services pour que ce symbole soit défini:

import MobileCoreServices 

Cela dit, la valeur par défaut de mediaTypes est de toute façon [kUTTypeImage]; vous n'avez donc pas besoin de la définir si c'est ce que vous voulez.

42
Aaron Brager

vous devez également ajouter UINavigationControllerDelegate à la liste des protocoles de la ViewController et à l’une des fonctions de délégation facultatives (si vous planifiez de prendre une photo)

Ceci est le code de travail pour votre problème:

import UIKit
import MobileCoreServices

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!){
        println("i've got an image");
    }

    @IBAction func capture(sender : UIButton) {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera){
            println("Button capture")

            var imag = UIImagePickerController()
            imag.delegate = self
            imag.sourceType = UIImagePickerControllerSourceType.Camera;
            imag.mediaTypes = [kUTTypeImage]
            imag.allowsEditing = false

            self.presentViewController(imag, animated: true, completion: nil)
        }
    }
}
23
Roman

De votre morceau de code, il est très clair que vous faites des erreurs à deux endroits: on définit delegate et ensuite, type de média imag.mediaTypes = kUTTypeImage

Première: Si vous examinez la définition delegate de UIImagePickerController, il est nécessaire de confirmer deux protocoles UINavigationControllerDelegate et UIImagePickerControllerDelegate, de sorte que vous devez adopter ces deux protocoles dans votre classe viewcontroller comme suit: 

class ViewController: UIViewController,UINavigationControllerDelegate,    UIImagePickerControllerDelegate

deuxième erreur: Si vous regardez dans la partie définition de mediaTypes, il faut clairement qu'un tableau de types de média soit passé, alors faites comme ça 

imag.mediaTypes = [kUTTypeImage]

En dehors de cela, j'ai écrit une classe très descendante pour la même tâche

Il est facile à comprendre et à intégrer.

Voici

//Declare property 
var imagePicker:ImageVideoPicker?

//Call below line of code properly, it will return an image

self.imagePicker = ImageVideoPicker(frame: self.view.frame, superVC: self) { (capturedImage) -> Void in
        if let captureImage = capturedImage{
        //you did it.....

        }

    }
7
Kamar Shad

Vous devez vous conformer au délégué comme ceci

 class ViewController: UIViewController, UIImagePickerControllerDelegate

Selon la documentation, par défaut, les types de support sont définis sur image. Vous pouvez donc supprimer cette ligne, car vous ne la définissez que sur image.

N'oubliez pas de mettre en œuvre les méthodes de protocole décrites dans la documentation: documentation

1
Kris Gellci

Essaye ça

import UIKit
import AVFoundation

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
var imagePicker: UIImagePickerController!

@IBOutlet weak var ImageView: UIImageView!



override func viewDidLoad() {
    super.viewDidLoad()


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func takeImage(sender: AnyObject) {

    imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = .Camera
    presentViewController(imagePicker, animated: true, completion: nil)

}


func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    imagePicker.dismissViewControllerAnimated(true, completion: nil)
    ImageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage
}

}
1
khan

Syntaxe de Swift 1.2:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
        let image = info[UIImagePickerControllerOriginalImage]



    }
0
splendidthoughts