2015-12-13 16 views
12

Mam problem z pobieraniem urządzenia za pomocą kamery cofania, gdy czujnik zbliżeniowy jest włączony. Nie chcę, aby podgląd kamery pokazywał się, wystarczy, że urządzenie zrobi zdjęcie i zaprezentuje je w obrazie. Mam działający czujnik zbliżeniowy i używam imagePicker.takePicture() do zrobienia zdjęcia, gdy włączony jest czujnik zbliżeniowy , ale to nie działa. Jaka jest metoda/funkcja, której mogę użyć, aby programowo zrobić zdjęcie bez wprowadzania danych przez użytkownika.Jak zrobić zdjęcie za pomocą czujnika zbliżeniowego?

To jest mój kod do tej pory:

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate { 

@IBOutlet var imageView: UIImageView! 

var imagePicker: UIImagePickerController! 

//*The function in question* 
func proximityChanged(notification: NSNotification) { 
    let device = notification.object as? UIDevice 
    if device?.proximityState == true { 
     print("\(device) detected!") 
+0

Czy mógłbyś wyjaśnić: która część nie działa? Czy czujnik zbliżeniowy jest wyzwalany, ale nie ma obrazu lub nie jest w ogóle uruchamiany, czy coś innego? – TwoStraws

+0

Tak, czujnik zbliżeniowy jest wyzwalany, ale zdjęcie nie jest wykonywane. –

+0

Czy nie byłoby lepiej użyć AVFoundation i nie przechodzić w ogóle przez selektor obrazu? – matt

Odpowiedz

2

Jeśli masz kłopoty robienia zdjęć z UIImagePickerController, proponuję przy użyciu AVFoundation.

Poniżej znajduje się przykład pracy. Przechwytywanie zdjęć jest wyzwalane przez czujnik zbliżeniowy.

Możesz dodać podgląd, jeśli potrzebujesz.

import UIKit 
import AVFoundation 

final class CaptureViewController: UIViewController { 

    @IBOutlet weak var imageView: UIImageView! 

    private static let captureSessionPreset = AVCaptureSessionPresetPhoto 
    private var captureSession: AVCaptureSession! 
    private var photoOutput: AVCaptureStillImageOutput! 
    private var initialized = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     initialized = setupCaptureSession() 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     if initialized { 
      captureSession.startRunning() 
      UIDevice.currentDevice().proximityMonitoringEnabled = true 
      NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(proximityStateDidChange), name: UIDeviceProximityStateDidChangeNotification, object: nil) 
     } 
    } 

    override func viewDidDisappear(animated: Bool) { 
     super.viewDidDisappear(animated) 
     if initialized { 
      NSNotificationCenter.defaultCenter().removeObserver(self, name: UIDeviceProximityStateDidChangeNotification, object: nil) 
      UIDevice.currentDevice().proximityMonitoringEnabled = false 
      captureSession.stopRunning() 
     } 
    } 

    dynamic func proximityStateDidChange(notification: NSNotification) { 
     if UIDevice.currentDevice().proximityState { 
      captureImage() 
     } 
    } 

    // MARK: - Capture Image 

    private func captureImage() { 
     if let c = findConnection() { 
      photoOutput.captureStillImageAsynchronouslyFromConnection(c) { sampleBuffer, error in 
       if let jpeg = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer), 
        let image = UIImage(data: jpeg) 
       { 
        dispatch_async(dispatch_get_main_queue()) { [weak self] in 
         self?.imageView.image = image 
        } 
       } 
      } 
     } 
    } 

    private func findConnection() -> AVCaptureConnection? { 
     for c in photoOutput.connections { 
      let c = c as? AVCaptureConnection 
      for p in c?.inputPorts ?? [] { 
       if p.mediaType == AVMediaTypeVideo { 
        return c 
       } 
      } 
     } 
     return nil 
    } 

    // MARK: - Setup Capture Session 

    private func setupCaptureSession() -> Bool { 
     captureSession = AVCaptureSession() 
     if captureSession.canSetSessionPreset(CaptureViewController.captureSessionPreset) { 
      captureSession.sessionPreset = CaptureViewController.captureSessionPreset 
      if setupCaptureSessionInput() && setupCaptureSessionOutput() { 
       return true 
      } 
     } 
     return false 
    } 

    private func setupCaptureSessionInput() -> Bool { 
     if let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo), 
      let captureDeviceInput = try? AVCaptureDeviceInput.init(device: captureDevice) 
     { 
      if captureSession.canAddInput(captureDeviceInput) { 
       captureSession.addInput(captureDeviceInput) 
       return true 
      } 
     } 
     return false 
    } 

    private func setupCaptureSessionOutput() -> Bool { 
     photoOutput = AVCaptureStillImageOutput() 
     photoOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 
     if captureSession.canAddOutput(photoOutput) { 
      captureSession.addOutput(photoOutput) 
      return true 
     } 
     return false 
    } 

} 
Powiązane problemy