当接近传感器启用时,我无法使用后视摄像机使设备拍摄图像.我不想让相机预览显示出来,只是想让设备拍摄照片并将其显示在imageView中.我有接近传感器工作,我使用imagePicker.takePicture()在接近传感器启用时拍摄图像,但似乎不起作用.我可以使用哪种方法/函数以编程方式拍摄没有用户输入的图片.

这是我的代码到目前为止

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!")

解决方法

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

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

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

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,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
    }

}

ios – 如何使用接近传感器拍摄照片?的更多相关文章

  1. 【IOS沉思录】开发软硬件SDK支持以及Swift语言

    iPhone和iPad软件支持iOS2007年发布2008年发布开发者SDKiOS当前的版本为:10.2官方开发者论坛:AppleDeveloperForums官方开发者教程文档资源库:Resources硬件支持A10处理器(iPhone7/7+)A9处理器(iPhone6s/6s+)A8处理器(iPhone6/iPhone6+)A8X处理器(iPadAir2)A7处理器(iPadMini3),A

  2. 基于Swift 的Apple Watch 开发教程介绍

    基于Swift的AppleWatch开发教程(一)内容简介本书使用swift的新版本,针对AppleWatch的基本编程和watchOS3开放的众多新接口进行撰写,主要包括表盘、音频视频和多种传感器等,功能新颖,紧随穿戴设备流行趋势,内容全面,代码齐全,讲解清楚,可以让读者深入浅出地掌握AppleWatch开发。第3章watchOS基础,开始正式进入watchOS应用的开发,介绍了页面和常用控件。第6章运动传感器和GPS,AppleWatch已经明确支持加速计、陀螺仪两种主要运动传感器,同时也支持GPS定

  3. android – S-View盖检测[磁传感器]

    我想为SamsungS-View封面编写一个应用程序.要确定盖子是否关闭,我想使用盖子中的磁铁而不是光传感器.我试着用我自己的Android磁性API:但我不知道如何解释这些数字.当然我也试过了x轴和y轴.它们取决于我握住手机的轴,如果我的手机后面或前面有翻盖,则没有太大的区别.您是否有任何想法如何使用磁传感器查看封面是否在我的手机前?

  4. android – 不同移动设备中的加速度计和陀螺仪精度

    我想用移动设备的传感器实现室内定位系统.这个问题已经在几个地方讨论过,比如-here和here第一步是确定哪个平台是实现这样一个系统的最佳平台.主要的可能性是三星的galaxy/galaxy标签或iphone/ipad.最重要的标准是传感器数据的准确性.但是,这种比较非常复杂,因为精度不仅取决于设备本身,还取决于其上方的软件层.有没有关于这个问题的研究?智能手机和平板电脑的传感器之间有区别吗?任何指向网站或文章的链接都会非常有用提前致谢!

  5. android – 用于Sensor.TYPE_ROTATION_VECTOR的传感器

    它是否使用罗盘和加速度计的组合?如果它们可用,它使用所有三个传感器.磁场传感器的使用对于获得一些绝对参考点至关重要.“旋转传感器”需要首先定向自身,然后消除陀螺仪随时间推移引入的漂移.陀螺仍然使用,因为它的精确性和良好的响应时间.加速度计有助于确定重力矢量.

  6. android – 如何提高加速度计和罗盘传感器的精度?

    我正在创建一个增强现实应用程序,当手机面向兴趣点时,它可以简单地显示文本视图.textview绘制在屏幕中的兴趣点位置.它工作正常,问题是指南针和加速度计非常“变化”,并且textview不断地左右上下移动,因为传感器的真空度.有办法解决吗?

  7. 在Android上以编程方式禁用屏幕开/关磁传感器

    一些着名的Nexus系列Android设备有一个磁性传感器,而不是android.hardware.Sensor.TYPE_MAGNETIC_FIELD专门用于使用内置小磁铁的手机壳自动打开/关闭屏幕.在我的应用程序中,我正在使用android.hardware.Sensor.TYPE_MAGNETIC_FIELD和SensorManager进行磁体检测,以检测用户是否在内部有磁铁的情况下触摸手机

  8. Android:使用NDK和轮询提高传感器采样率

    我想编写一个应用程序,从不同的传感器中读取尽可能多的传感器状态(每次).所以我必须调查使用NDK是否有优势.这是我的问题:a)从传感器读取传感器值时的瓶颈是什么?我可以使用NDK来提高费率吗?c)NDK的使用是否会对应用的功耗产生任何影响?我没有发现任何相关信息.d)我是Android新手.使用NDK而不是普通的Java是否更有能力?根据这个sample-code,使用事件队列与传感器进行交互似乎很简单,但是编译代码并从应用程序中使用它有多大的代价?

  9. 如何在Android中的Graph中绘制实时传感器值?

    我想在android应用程序中绘制传感器值图.哪个图书馆最适合这个?

  10. android – 使用方向传感器指向特定位置

    我试图实现一个箭头,使用方向传感器来指向特定的位置.GooglePlaces会在ListView中为其找到的每个地方实现此箭头.我设法得到方位角,但是给出一个位置,我不知道如何继续计算我需要的角度.此外,我需要从北方和北极的转换.有人有这样的实现的例子吗?提前致谢.解决方法我解决了如果要绘制箭头或其他东西来指向方向,请使用canvas.rotate.我们传递一个负面的参数,因为画布旋转是逆时针的.

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部