Swift开发小技巧--识别选中照片中的二维码

  • 点击相册按钮,打开用户相册
    @IBAction func photoBtnClick(sender: AnyObject) {
        // 打开相册
        // 1.判断是否能够打开相册
        /*
        case PhotoLibrary  相册
        case Camera 相机
        case SavedPhotosAlbum 图片库
        */
        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary)
        {
            return
        }

        // 2.创建相册控制器
        let imagePickerVC = UIImagePickerController()

        imagePickerVC.delegate = self // 代理方法中识别照片中的二维码
        // 3.弹出相册控制器
        presentViewController(imagePickerVC, animated: true, completion: nil)

    }
  • 打开相册时,创建了相册控制器,设置相册控制器的代理,代理中的方法实现识别二维码.需要同时实现两个代理UINavigationControllerDelegate, UIImagePickerControllerDelegate
    // 过时的方法
    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

    }
    // 未过时的方法
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

        // 1.取出选中的图片
        guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else
        {
            return
        }

        guard let ciImage = CIImage(image: image) else
        {
            return
        }

        // 2.从选中的图片中读取二维码数据
        // 2.1创建一个探测器
        // CIDetectorTypeFace -- 探测器还可以搞人脸识别
        let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyLow])
        // 2.2利用探测器探测数据
        let results = detector.featuresInImage(ciImage)
        // 2.3取出探测到的数据
        for result in results
        {
            ChaosLog((result as! CIQRCodeFeature).messageString)
        }

        // 注意: 如果实现了该方法, 当选中一张图片时系统就不会自动关闭相册控制器
        picker.dismissViewControllerAnimated(true, completion: nil)
    }