如何使用takePicture()在iOS中以编程方式拍照?

问题描述:

我正在开发一款应用程序来帮助视力受损的人阅读餐厅菜单,因此我需要通过一次双击屏幕捕捉照片。如何使用takePicture()在iOS中以编程方式拍照?

我已经成功地使用了UIImagePickerController来使用标准捕捉界面拍照。为了通过双击执行此操作,我已将覆盖视图设置为一般的ImageView,禁用相机控件并调用.takePicture()方法。出于某种原因,处理图像捕获的委托方法不起作用。任何人都可以请指出我缺少什么?

我已经评论了现在的图像选择器的行,就好像它被称为我永远不会离开它。我的覆盖层没有按钮,因为拍照应该是通过双击进行的。

任何帮助,非常感谢。

此致敬礼,

安德烈。下面

代码:

import UIKit 

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    @IBOutlet weak var debugLabel: UILabel! 
    @IBOutlet var tapChangeState: UITapGestureRecognizer! 

    @IBOutlet weak var imageView: UIImageView! 
    var imagePicker = UIImagePickerController() // instantiates an image picker controller. 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // setting up Image Picker 
     imagePicker.delegate = self // setup the view controller as the image picker delegate. 
     imagePicker.allowsEditing = false // disable image editing by the user 
     imagePicker.sourceType = UIImagePickerControllerSourceType.camera // set source as camera 
     imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.rear // use rear camera 

     // setting up gesture recognizer 
     tapChangeState.numberOfTouchesRequired = 1 // number of fingers required for change state detection 
     tapChangeState.numberOfTapsRequired = 2 

     debugLabel.text = "Loaded" 
    } 

    @IBAction func tapChangeStateDetected(_ sender: UITapGestureRecognizer) { 
     imagePicker.cameraOverlayView = imageView 
     imagePicker.showsCameraControls = false // disable camera controls 
     imagePicker.takePicture() // takes the shot 
     debugLabel.text = "Tap detected." 
     //present(imagePicker, animated: true, completion: nil) 
    } 

    // Conforming to ControllerDelegate protocol: 
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
      imageView.contentMode = .scaleAspectFill 
      imageView.image = selectedImage 
      debugLabel.text = "Captured" 
     } 
     dismiss(animated: true, completion: nil) 
    } 
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
     dismiss(animated: false, completion: nil) 
    } 
    // Controller Delegate protocol functions end here 
} 
+1

实际问题是什么“委托方法...不起作用”? – shallowThought

+0

imagePickerController从不被调用。检测到双击,因此调用imagePicker.takePicture(),但没有任何反应。我添加到接口的调试标签永远不会更新为“Captured”,我知道这段代码从未执行过。 –

UIImagePickerController需要在拍摄照片之前提交第一次。

present(imagePicker, animated: false) { 
    self.imagePicker.takePicture() 
} 

2.确保了 “摄像头的使用许可” 在您的Info.plist设置。

<key>Privacy - Camera Usage Description</key> 
<string>My Awesome App requires access to your phone’s camera.</string> 

3.cameraOverlayView是叠加在默认摄像机UI的图。我相信你的例子中你不想使用imageView,因为这是使用捕获图像设置的视图。如果您将cameraOverlayView设置为imageView,则将从主视图控制器层次结构中删除imageView。为了让你的例子工作,我从IBAction中删除了imagePicker.cameraOverlayView = imageView

+0

谢谢你,克里斯!就是这样。第二次我尝试捕捉某些东西时,该应用程序崩溃了,但我想这是另一个问题。现在我回来调试了。 :) –

+0

将我的更改回滚到最新版本我已经使用标准相机控件并添加了代码。现在完美地工作! :)'present(imagePicker,animated:true,completion:{self.imagePicker.takePicture()})' –