在Swift 2中访问摄像机iOS

问题描述:

我想要访问摄像头并在iPad应用程序中拍照,下面是适用于swift 1.2的代码,但在Swift中出现了3种类型的错误(在BLOCK注释中突出显示)来自“简明英汉词典”我花时间寻找快速写作的方式,但没有到任何地方。任何建议非常感谢。在Swift 2中访问摄像机iOS

import UIKit 
import AVFoundation 

class PictureController: UIViewController { 

    let captureSession = AVCaptureSession() 
    var previewLayer : AVCaptureVideoPreviewLayer? 

    // If we find a device we'll store it here for later use 
    var captureDevice : AVCaptureDevice? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view, typically from a nib. 
     captureSession.sessionPreset = AVCaptureSessionPresetHigh 

     let devices = AVCaptureDevice.devices() 

     // Loop through all the capture devices on this phone 
     for device in devices { 
      // Make sure this particular device supports video 
      if (device.hasMediaType(AVMediaTypeVideo)) { 
       // Finally check the position and confirm we've got the back camera 
       if(device.position == AVCaptureDevicePosition.Back) { 
        captureDevice = device as? AVCaptureDevice 
        if captureDevice != nil { 
         print("Capture device found") 
         beginSession() 
        } 
       } 
      } 
     } 

    } 

    func focusTo(value : Float) { 
     if let device = captureDevice { 
      if(device.lockForConfiguration(nil)) { // CALL CAN THROW BUT IS NOT MARKED WITH 'TRY' AND THE ERROR IS NOT HANDLED 
// nil IS NOT COMPATIBLE WITH EXPECTED ARGUMENT TYPE '()' 
       device.setFocusModeLockedWithLensPosition(value, completionHandler: { (time) -> Void in 
        // 
       }) 
       device.unlockForConfiguration() 
      } 
     } 
    } 

    let screenWidth = UIScreen.mainScreen().bounds.size.width 
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { //METHOD DOES NOT OVERRIDE ANY METHOD FROM SUPERCLASS 
     let anyTouch = touches.anyObject() as! UITouch 
     let touchPercent = anyTouch.locationInView(self.view).x/screenWidth 
     focusTo(Float(touchPercent)) 
    } 

    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { //METHOD DOES NOT OVERRIDE ANY METHOD FROM SUPERCLASS 
     let anyTouch = touches.anyObject() as! UITouch 
     let touchPercent = anyTouch.locationInView(self.view).x/screenWidth 
     focusTo(Float(touchPercent)) 
    } 

    func configureDevice() { 
     if let device = captureDevice { 
      device.lockForConfiguration(nil) // CALL CAN THROW BUT IS NOT MARKED WITH 'TRY' AND THE ERROR IS NOT HANDLED 
// nil IS NOT COMPATIBLE WITH EXPECTED ARGUMENT TYPE '()' 
      device.focusMode = .Locked 
      device.unlockForConfiguration() 
     } 

    } 

    func beginSession() { 

     configureDevice() 

     var err : NSError? = nil 
     captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &err)) 
// Cannot invoke initializer for type 'AVCaptureDeviceInput' with an argument list of type '(device: AVCaptureDevice?, error: inout NSError?)' 

     if err != nil { 
      print("error: \(err?.localizedDescription)") 
     } 

     previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
     self.view.layer.addSublayer(previewLayer) 
     previewLayer?.frame = self.view.layer.frame 
     captureSession.startRunning() 
    } 


} 

错误1:呼叫可以扔掉,但是没有打上“尝试”和错误没有被处理 类型“()”不符合协议“BooleanType”

错误2:方法不从其超 覆盖任何方法的touchesBegan和touchesMoved

错误3:无法调用初始化为类型“AVCaptureDeviceInput”与类型的参数列表“(设备:AVCaptureDevice ?,错误:INOUT NSError)”

UPDATE:

所有其他问题是固定的(请参考意见,如果你正在寻找解决方案),除了下面的一个。

func focusTo(value : Float) { 
     if let device = captureDevice { 
      if(device.lockForConfiguration()) { // THIS LINE IS THROWING BELOW MENTIONED ERROR 
       device.setFocusModeLockedWithLensPosition(value, completionHandler: { (time) -> Void in 

       }) 
       device.unlockForConfiguration() 
      } 
     } 
    } 

错误:

Type '()' does not conform to protocol 'BooleanType'

Call can throw, but it is not marked with 'try' and the error is not handled

+0

您是否尝试过运行Swift 2 migrator? –

+1

错误3:只需添加尝试!在AVCaptureDeviceInput前面并删除最后一个参数“,错误:&err” –

+0

@AaronBrager迁移器没有显示任何有关这些错误的建议。当我尝试编译和构建时,编译器会突出显示出现以上错误的行。 – Rao

do { 
    try device.lockForConfiguration() 
    device.setFocusModeLockedWithLensPosition(value, completionHandler: { (time) -> Void in 
       // 
    }) 
    device.unlockForConfiguration() 
} catch let error as NSError { 
    print(error.code) 
} 


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

} 
+0

工程,现在我试图找出这个错误'方法不重写任何方法从它的超类'touchesBegan和touchesMoved – Rao

+0

现在它的Objective-C选择器现在抛出'方法'touchesBegan(_:withEvent :)' 'touchesBegan:withEvent:'与来自具有相同Objective-C选择器的超类'UIResponder'的touchesBegan(_:withEvent :)冲突。 – Rao

+0

您只需在键入它时让它自动完成。看看我的编辑。这个错误已经被问过很多次了。 –

我在这里发布一个完整的解决方案Swift2,它整合了gkhanacer https://*.com/a/36719940/2144994解决方案,并在这个问题上的所有代码示例。这是一个完整的ViewController

import UIKit 
import AVFoundation 

class FirstViewController: UIViewController { 

let captureSession = AVCaptureSession() 
var previewLayer : AVCaptureVideoPreviewLayer? 

// If we find a device we'll store it here for later use 
var captureDevice : AVCaptureDevice? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view, typically from a nib. 
    captureSession.sessionPreset = AVCaptureSessionPresetHigh 

    let devices = AVCaptureDevice.devices() 

    // Loop through all the capture devices on this phone 
    for device in devices { 
     // Make sure this particular device supports video 
     if (device.hasMediaType(AVMediaTypeVideo)) { 
      // Finally check the position and confirm we've got the back camera 
      if(device.position == AVCaptureDevicePosition.Back) { 
       captureDevice = device as? AVCaptureDevice 
       if captureDevice != nil { 
        print("Capture device found") 
        beginSession() 
       } 
      } 
     } 
    } 

} 

let screenWidth = UIScreen.mainScreen().bounds.size.width 

func configureDevice() { 
    if let device = captureDevice { 
     do { 
     try device.lockForConfiguration() 
     device.focusMode = .AutoFocus 
     device.unlockForConfiguration() 
     } catch let error as NSError { 
      print(error.code) 
     } 
    } 

} 


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    let screenSize = previewLayer!.bounds.size 
    let frameSize:CGSize = view.frame.size 
    if let touchPoint = touches.first { 

     let location:CGPoint = touchPoint.locationInView(self.view) 

     let x = location.x/frameSize.width 
     let y = 1.0 - (location.x/frameSize.width) 

     let focusPoint = CGPoint(x: x, y: y) 

     print("POINT : X: \(x), Y: \(y)") 


     let captureDevice = (AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as! [AVCaptureDevice]).filter{$0.position == .Back}.first 

     if let device = captureDevice { 
      do { 
       try device.lockForConfiguration() 

       let support:Bool = device.focusPointOfInterestSupported 

       if support { 

        print("focusPointOfInterestSupported: \(support)") 

        device.focusPointOfInterest = focusPoint 

        // device.focusMode = .ContinuousAutoFocus 
        device.focusMode = .AutoFocus 
        // device.focusMode = .Locked 

        device.unlockForConfiguration() 

        print("Focus point was set successfully") 
       } 
       else{ 
        print("focusPointOfInterestSupported is not supported: \(support)") 
       } 
      } 
      catch { 
       // just ignore 
       print("Focus point error") 
      } 
     } 
    } 
} 

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    if let touch = touches.first{ 
     print("\(touch)") 
    } 
    super.touchesEnded(touches, withEvent: event) 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    if let touch = touches.first{ 
     print("\(touch)") 
    } 
    super.touchesMoved(touches, withEvent: event) 
} 


func beginSession() { 

    configureDevice() 

    try! captureSession.addInput(AVCaptureDeviceInput(device: captureDevice)) 
    // Cannot invoke initializer for type 'AVCaptureDeviceInput' with an argument list of type '(device: AVCaptureDevice?, error: inout NSError?)' 


    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
    self.view.layer.addSublayer(previewLayer!) 
    previewLayer?.frame = self.view.layer.frame 
    captureSession.startRunning() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


}