斯威夫特3照片拍摄
我使用这段代码:斯威夫特3照片拍摄
func capturePhoto(blockCompletion: @escaping blockCompletionCapturePhoto) {
guard let connectionVideo = self.stillCameraOutput.connection(withMediaType: AVMediaTypeVideo) else {
blockCompletion(nil, nil)
return
}
connectionVideo.videoOrientation = AVCaptureVideoOrientation.orientationFromUIDeviceOrientation(orientation: UIDevice.current.orientation)
self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { (sampleBuffer: CMSampleBuffer!, err: NSError!) -> Void in
if let err = err {
blockCompletion(image: nil, error: err)
}
else {
if let sampleBuffer = sampleBuffer, let dataImage = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) {
let image = UIImage(data: dataImage)
blockCompletion(image: image, error: nil)
}
else {
blockCompletion(image: nil, error: nil)
}
}
}
}
它在雨燕2.0工作正常,但转换后它不工作了。 这条线:
self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { (sampleBuffer: CMSampleBuffer!, err: NSError!) -> Void in
是给我下面的错误:
Cannot convert value of type '(CMSampleBuffer!, NSError!) -> Void' to expected argument type '((CMSampleBuffer?, Error?) -> Void)!'
我已经尝试了一些东西,但不能把它解决。 希望有人能帮助我。
什么错误
Cannot convert value of type '(CMSampleBuffer!, NSError!) -> Void' to expected argument type '((CMSampleBuffer?, Error?) -> Void)!'
基本上说的是,你的论点是错误的类型((CMSampleBuffer!, NSError!) -> Void
),而应该是类型((CMSampleBuffer?, Error?) -> Void)!
的。
要做到这一点,请尝试使用此代码,它会自动让你的块符合正确的类型:
self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { sampleBuffer, error in
//do stuff with your sample buffer, don't forget to handle errors
}
它看起来像一个奇怪的类型,但我认为这是一个小错误 - 苹果的地方,而迁移此代码从ObjC到Swift 1到Swift 2到Swift 3.
我还没有测试过这段代码,但我认为它应该可以工作,让我知道它是否真的做到了!
我可以确认这解决了Swift 3中的编译错误 –
在swift 3中该命令改变了!
来自:
captureStillImageAsynchronouslyFromConnection
到:
captureStillImageAsynchronously
所以试试这个代码:
self.stillCameraOutput?.captureStillImageAsynchronously(from: connectionVideo, completionHandler: {
(sampleBuffer, error) in
// do your stuff here
}
我认为'NSError'得到了重新命名为'Error'斯威夫特3.只需删除'NS',它应该没问题。你是否迁移了你的代码?如果它没有捕捉到它会很奇怪。 – Losiowaty