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

标签 ios swift uiimagepickercontroller

我正在开发一款应用程序来帮助视障人士阅读餐厅菜单,因此我需要通过双击屏幕来拍摄照片。

我已经成功使用 UIImagePickerController 使用标准捕获接口(interface)来拍照。为了通过双击来完成此操作,我将覆盖 View 设置为通用 ImageView,禁用相机控件并调用 .takePicture() 方法。由于某种原因,处理图像捕获的委托(delegate)方法不起作用。谁能指出我缺少什么?

我已经评论了关于呈现图像选择器的行,就好像它被称为我永远不能离开它一样。我的叠加层没有按钮,因为拍照应该通过双击来进行。

非常感谢任何帮助。

最诚挚的问候,

安德烈。

代码如下:

 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. 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 上的 View 。我相信在您的示例中您不想使用 imageView 因为这是使用捕获的图像设置的 View 。如果您将 cameraOverlayView 设置为 imageView,则 imageView 将从主视图 Controller 层次结构中删除。为了使您的示例正常工作,我从 IBAction 中删除了 imagePicker.cameraOverlayView = imageView

关于ios - 如何在 iOS 中使用 takePicture() 以编程方式拍照?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46206239/

相关文章:

ios - 动态调整弹出窗口大小时防止动画

ios - swift : Background Color fading animation (SpriteKit)

ios - 使用 Vision 从照片库扫描图像

ios - Avplayer ios 10* 的屏幕截图图像是黑色图像

ios - 转至 SecondViewController 后数据消失

ios - 是否可以缩放应用程序的整个 View ?

ios - 以关联类型作为属性的协议(protocol)

Swift 3 - UIImageWriteToSavedPhotosAlbum 内存问题

iphone - UIImagePickerViewController 返回的图像未显示

objective-c - 带有下划线前缀 : what does this mean? 的合成属性和变量