如何在swift中使用UIImagePickerController捕获相机?

use*_*888 36 uiimagepickercontroller swift xcode6 ios8

我正在尝试UIImagePickerController快速使用但不工作......

我的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)

    }
   }   
}
Run Code Online (Sandbox Code Playgroud)

我在下面的代码行中有错误

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

我已经阅读过kUTTypeImage在swift 中无法使用的内容.但是我不知道,我正在使用这个函数.有帮助吗?

谢谢!!

小智 84

您还应该在控制器中导入MobileCoreServices:

import MobileCoreServices 
Run Code Online (Sandbox Code Playgroud)

然后将类型放在方括号内,如下所示:

image.mediaTypes = [kUTTypeImage]
Run Code Online (Sandbox Code Playgroud)

Swift 2.0及更高版本

image.mediaTypes = [kUTTypeImage as String]
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 !我花了一个小时试图理解"未解决的参考"编译错误...... !! (3认同)

Aar*_*ger 43

Swift 2.0

在Swift 2.0(Xcode 7)中,您需要显式地将kUTTypeImage(a CFString)转换为String:

picker.mediaTypes = [kUTTypeImage as String]
Run Code Online (Sandbox Code Playgroud)

您仍然需要导入移动核心服务才能定义此符号:

import MobileCoreServices 
Run Code Online (Sandbox Code Playgroud)

的这就是说,默认值mediaTypes[kUTTypeImage],所以你不需要设置它,如果这就是你想要的.


Rom*_*man 24

你也应该添加UINavigationControllerDelegate到协议列表中的ViewController 一个和一个可选的委托函数(如果你计划得到一张图片)

这是您的问题的工作代码:

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在Beta5中,imag.mediaTypes = [kUTTypeImage]会导致错误.将其更改为imagePicker.mediaTypes = NSArray(对象:kUTTypeImage),它工作正常. (2认同)

Kam*_*had 7

从你的代码中可以看出,你在两个地方犯错是设置错误,delegate第二个是设置媒体类型imag.mediaTypes = kUTTypeImage

第一个:如果你查看它的delegate定义UIImagePickerController需要确认两个协议UINavigationControllerDelegate,UIImagePickerControllerDelegate所以你必须在你的viewcontroller类中采用这两个协议,如

class ViewController: UIViewController,UINavigationControllerDelegate,    UIImagePickerControllerDelegate
Run Code Online (Sandbox Code Playgroud)

第二个错误:如果你查看mediaTypes它的定义部分,显然需要传递一系列媒体类型,所以这样做

imag.mediaTypes = [kUTTypeImage]
Run Code Online (Sandbox Code Playgroud)

除此之外,我还为同一项任务编写了一个非常下降的课程

它易于理解和集成.

干得好

//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.....

        }

    }
Run Code Online (Sandbox Code Playgroud)

  • 你问了一个解释,现在你贬低我提供一个解释.优雅. (3认同)
  • 我认为你应该更清楚地知道ImageVideoPicker是你自己的类.我没有投票给你,但我确实浪费时间检查ImageVideoPicker是否是一个新的swift-only类或其他东西. (2认同)

Kri*_*lci 2

你必须像这样遵守代表

 class ViewController: UIViewController, UIImagePickerControllerDelegate
Run Code Online (Sandbox Code Playgroud)

根据文档,默认情况下,媒体类型设置为图像,因此您可以继续删除该行,因为您仅将其设置为图像。

不要忘记实现文档中概述的协议方法: 文档