2017-09-13 8 views
1

私は視覚障害者がレストランのメニューを読むのを助けるためにアプリに取り組んでいるので、画面の1回のダブルタップで写真をキャプチャする必要があります。iOSでtakePicture()を使ってプログラムで写真を撮るにはどうすればよいですか?

私は正常に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"に更新されません。コードの一部が実行されることはありません。 –

答えて

2

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上に重ねている図です。あなたの例では、imageViewを使用したくないと信じています。これは、キャプチャされたイメージで設定されているビューであるためです。 cameraOverlayViewimageViewに設定すると、imageViewがメインビューコントローラ階層から削除されます。あなたのサンプルを動作させるために、IBActionからimagePicker.cameraOverlayView = imageViewを削除しました。

+0

ありがとう、クリス!それはそれだった。 2回目に何かをキャプチャしようとアプリがクラッシュしましたが、別の問題だと思います。今私はデバッグに戻ります。 :) –

+0

私は標準のカメラコントロールで作業していたコードを追加した最新バージョンへの変更をロールバックしました。完璧に今働いて! :) 'present(imagePicker、animated:true、完了:{self.imagePicker.takePicture()})' –

関連する問題