2017-09-13 3 views
1

시각 장애인이 식당 메뉴를 읽는 것을 돕기 위해 앱을 작업 중이므로 화면을 두 번 탭하여 사진을 캡처해야합니다.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()가 호출되지만 아무런 반응이 없습니다. 인터페이스에 추가 한 디버그 레이블은 "캡처 됨"으로 업데이트되지 않습니다. 코드 조각이 실행되지 않습니다. –

답변

2

1UIImagePickerController 요구는 사진을 촬영하기 전에 1을 발표한다.

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

2는 "카메라 사용 권한이"당신의 Info.plist에 설정되어 확인합니다.

3.cameraOverlayView

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

기본 카메라 UI를 통해 오버레이되는 뷰입니다. 당신의 예제에서 당신은 imageView을 사용하고 싶지 않다고 믿습니다. 왜냐하면 그것은 캡쳐 된 이미지로 설정된 뷰이기 때문입니다. cameraOverlayViewimageView으로 설정하면 imageView이 기본보기 컨트롤러 계층에서 제거됩니다. 예를 사용하려면 IBAction에서 imagePicker.cameraOverlayView = imageView을 삭제했습니다.

+0

감사합니다, 크리스! 그거였다. 앱이 두 번째로 무언가를 잡으려고했을 때 추락했지만, 또 다른 문제라고 생각합니다. 이제 디버깅을 다시합니다. :) –

+0

표준 카메라 컨트롤로 작업하고 코드를 추가 한 최신 버전으로 롤백했습니다. 완벽하게 일하세요! :)'present (imagePicker, animated : true, 완료 : {self.imagePicker.takePicture()})' –