Ich versuche, UIImagePickerController
in Swift zu verwenden, funktioniert aber nicht ...
mein 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)
}
}
}
Ich habe Fehler in der folgenden Codezeile
imag.delegate = self
(Type'ViewControlles does confoorm to protocol 'UIImagePickerControllerDelegate')
imagePicker.mediaTypes = kUTTypeImage
(use of unresolved identifier kUTTypeImage)
Ich habe gelesen, dass kUTTypeImage
nicht in Swift verwendet werden kann. Aber ich weiß nicht, ich verwende diese Funktionen. Irgendeine Hilfe?
Vielen Dank!!
Sie sollten MobileCoreServices auch in den Controller importieren:
import MobileCoreServices
und dann den Typ in eckige Klammern wie folgt einfügen:
image.mediaTypes = [kUTTypeImage]
Swift 2.0 und höher
image.mediaTypes = [kUTTypeImage as String]
In Swift 2.0 (Xcode 7) müssen Sie kUTTypeImage
(eine CFString
) explizit in String
umwandeln:
picker.mediaTypes = [kUTTypeImage as String]
Um dieses Symbol zu definieren, müssen Sie jedoch noch Mobile Core Services importieren:
import MobileCoreServices
Der Standardwert von mediaTypes
ist ohnehin [kUTTypeImage]
. Sie müssen ihn also nicht festlegen, wenn Sie dies möchten.
sie sollten auch UINavigationControllerDelegate
zur Protokollliste der ViewController
und einer der optionalen Delegatfunktionen hinzufügen (wenn Sie planen, ein Bild zu erhalten)
Dies ist der Arbeitscode für Ihr Problem:
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)
}
}
}
Aus Ihrem Code-Stück ist es sehr klar, dass Sie an zwei Stellen Fehler machen, wobei eine delegate
und zweitens Medientyp imag.mediaTypes = kUTTypeImage
eingestellt wird.
Erstes: Wenn Sie sich die delegate
-Definition von UIImagePickerController
ansehen, müssen Sie zwei Protokolle UINavigationControllerDelegate
und UIImagePickerControllerDelegate
bestätigen, sodass Sie diese beiden Protokolle in Ihre viewcontroller
-Klasse wie übernehmen müssen
class ViewController: UIViewController,UINavigationControllerDelegate, UIImagePickerControllerDelegate
zweiter Fehler: Wenn Sie in den Definitionsteil von mediaTypes
schauen, müssen Sie eindeutig ein Array von Medientypen übergeben
imag.mediaTypes = [kUTTypeImage]
Abgesehen davon habe ich für dieselbe Aufgabe eine sehr absteigende Klasse geschrieben
Es ist leicht zu verstehen und zu integrieren.
//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.....
}
}
Sie müssen sich dem Delegierten so anpassen
class ViewController: UIViewController, UIImagePickerControllerDelegate
In der Dokumentation ist der Medientyp standardmäßig auf image festgelegt, sodass Sie diese Zeile löschen können, da Sie sie nur auf image setzen.
Vergessen Sie nicht, die Protokollmethoden zu implementieren, die in der Dokumentation beschrieben sind: documentation
Versuche dies
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
}
}
Swift 1.2 Syntax:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
let image = info[UIImagePickerControllerOriginalImage]
}