我在这里与代表有一些问题。我在谷歌搜索过,找不到帮助我的答案。所以我写了AVCapturePhotoCaptureDelegate
,因为有人告诉我。我该怎么办?(如何处理委托)
stillImageOutput?.capturePhoto(with: sampleBuffer!, delegate: AVCapturePhotoCaptureDelegate){
if sampleBuffer != nil {
let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
let dataProvider = CGDataProviderCreateWithCFData(imageData)
let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault)
let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right)
self.captureImageView.image = image
}
}
答案 0 :(得分:0)
AVCapturePhotoCaptureDelegate是一种协议。您可以在此处阅读有关协议的更多信息https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html,但相关信息如下:
协议定义了方法,属性等的蓝图 适合特定任务或功能的要求。 然后可以通过类,结构或枚举来采用该协议 提供这些要求的实际实施。随便哪种 据说符合协议的要求 该协议。
capturePhoto要求您执行的操作是传递符合协议的Object。按照惯例,我们称之为委托(将其视为一系列委托给另一个对象的功能)。
这基本上是一个回电。 capturePhoto“know”(因为你符合协议)代表将包含它需要调用的函数,以便你可以处理图像。
要成功传递委托,您需要定义一个符合协议的对象,并将该对象的实例作为委托传递给该函数。您必须声明要从协议中使用的方法。这是一个部分示例 - 不要复制粘贴,你需要弄清楚实现所需的内容。
class PhotoDelegate() : AVCapturePhotoCaptureDelegate {
optional func capture(_ captureOutput: AVCapturePhotoOutput,
didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?,
previewPhotoSampleBuffer: CMSampleBuffer?,
resolvedSettings: AVCaptureResolvedPhotoSettings,
bracketSettings: AVCaptureBracketedStillImageSettings?,
error: Error?) {
// YOUR CODE TO PROCESS THE IMAGE GOES HERE
}
}
let myPhotoDelegate = PhotoDelegate()
// myPhotoDelegate is what you'll pass to the delegate: parameter
我会非常仔细地注意到,根据AVCapturePhotoCaptureDelegate的文档,这些方法在编译时都是可选的,需要实现的实际方法取决于你传递的设置。
照片输出调用的代理方法取决于照片 您启动捕获的设置。该协议中的所有方法都是 在编译时可选,但在运行时您的委托对象必须 根据您的照片设置回复某些方法: