ios – 如何使用接近传感器拍摄照片?

前端之家收集整理的这篇文章主要介绍了ios – 如何使用接近传感器拍摄照片?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当接近传感器启用时,我无法使用后视摄像机使设备拍摄图像.我不想让相机预览显示出来,只是想让设备拍摄照片并将其显示在imageView中.我有接近传感器工作,我使用imagePicker.takePicture()在接近传感器启用时拍摄图像,但似乎不起作用.我可以使用哪种方法/函数以编程方式拍摄没有用户输入的图片.

这是我的代码到目前为止

  1. class ViewController: UIViewController,UINavigationControllerDelegate,UIImagePickerControllerDelegate {
  2.  
  3. @IBOutlet var imageView: UIImageView!
  4.  
  5. var imagePicker: UIImagePickerController!
  6.  
  7. //*The function in question*
  8. func proximityChanged(notification: NSNotification) {
  9. let device = notification.object as? UIDevice
  10. if device?.proximityState == true {
  11. print("\(device) detected!")

解决方法

如果你有麻烦用UIImagePickerController捕获照片,我建议使用AVFoundation.

以下是一个工作示例.照片捕获由接近传感器触发.

您可以添加一个预览,如果你需要它.

  1. import UIKit
  2. import AVFoundation
  3.  
  4. final class CaptureViewController: UIViewController {
  5.  
  6. @IBOutlet weak var imageView: UIImageView!
  7.  
  8. private static let captureSessionPreset = AVCaptureSessionPresetPhoto
  9. private var captureSession: AVCaptureSession!
  10. private var photoOutput: AVCaptureStillImageOutput!
  11. private var initialized = false
  12.  
  13. override func viewDidLoad() {
  14. super.viewDidLoad()
  15. initialized = setupCaptureSession()
  16. }
  17.  
  18. override func viewWillAppear(animated: Bool) {
  19. super.viewWillAppear(animated)
  20. if initialized {
  21. captureSession.startRunning()
  22. UIDevice.currentDevice().proximityMonitoringEnabled = true
  23. NSNotificationCenter.defaultCenter().addObserver(self,selector: #selector(proximityStateDidChange),name: UIDeviceProximityStateDidChangeNotification,object: nil)
  24. }
  25. }
  26.  
  27. override func viewDidDisappear(animated: Bool) {
  28. super.viewDidDisappear(animated)
  29. if initialized {
  30. NSNotificationCenter.defaultCenter().removeObserver(self,object: nil)
  31. UIDevice.currentDevice().proximityMonitoringEnabled = false
  32. captureSession.stopRunning()
  33. }
  34. }
  35.  
  36. dynamic func proximityStateDidChange(notification: NSNotification) {
  37. if UIDevice.currentDevice().proximityState {
  38. captureImage()
  39. }
  40. }
  41.  
  42. // MARK: - Capture Image
  43.  
  44. private func captureImage() {
  45. if let c = findConnection() {
  46. photoOutput.captureStillImageAsynchronouslyFromConnection(c) { sampleBuffer,error in
  47. if let jpeg = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer),let image = UIImage(data: jpeg)
  48. {
  49. dispatch_async(dispatch_get_main_queue()) { [weak self] in
  50. self?.imageView.image = image
  51. }
  52. }
  53. }
  54. }
  55. }
  56.  
  57. private func findConnection() -> AVCaptureConnection? {
  58. for c in photoOutput.connections {
  59. let c = c as? AVCaptureConnection
  60. for p in c?.inputPorts ?? [] {
  61. if p.mediaType == AVMediaTypeVideo {
  62. return c
  63. }
  64. }
  65. }
  66. return nil
  67. }
  68.  
  69. // MARK: - Setup Capture Session
  70.  
  71. private func setupCaptureSession() -> Bool {
  72. captureSession = AVCaptureSession()
  73. if captureSession.canSetSessionPreset(CaptureViewController.captureSessionPreset) {
  74. captureSession.sessionPreset = CaptureViewController.captureSessionPreset
  75. if setupCaptureSessionInput() && setupCaptureSessionOutput() {
  76. return true
  77. }
  78. }
  79. return false
  80. }
  81.  
  82. private func setupCaptureSessionInput() -> Bool {
  83. if let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo),let captureDeviceInput = try? AVCaptureDeviceInput.init(device: captureDevice)
  84. {
  85. if captureSession.canAddInput(captureDeviceInput) {
  86. captureSession.addInput(captureDeviceInput)
  87. return true
  88. }
  89. }
  90. return false
  91. }
  92.  
  93. private func setupCaptureSessionOutput() -> Bool {
  94. photoOutput = AVCaptureStillImageOutput()
  95. photoOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
  96. if captureSession.canAddOutput(photoOutput) {
  97. captureSession.addOutput(photoOutput)
  98. return true
  99. }
  100. return false
  101. }
  102.  
  103. }

猜你在找的iOS相关文章