2016-12-29 3 views
0

У меня возникают некоторые проблемы с делегатом. Я искал в Google и не смог найти ответ, который поможет мне. Поэтому я написал AVCapturePhotoCaptureDelegate, потому что кто-то сказал мне. что делать? (что делать с делегатом)Дополнительный аргумент «делегат» в вызове (Swift 3)

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

Что именно вы хотите достичь с помощью stillImageOutput? Вы используете сеанс захвата? Как я не могу найти эту функцию в AVCaptureStillImageOutput() –

+0

Да, я использую захват session.I не удалось найти (Apple удалил его и удалил stillImageOutput) AVCaptureStillImageOutput(), поэтому я использовал AVCapturePhotoOutput() и capturePhoto (с: , делегат :) –

+0

Он доступен для последней версии iOS, он будет устаревшим в будущей версии. Таким образом, вы не можете получить изображение из сеанса захвата, используя AVCapturePhotoOutput() правильно? –

ответ

0

AVCapturePhotoCaptureDelegate - это протокол. Вы можете прочитать больше о протоколах здесь https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html но соответствующая информация заключается в следующем:

Протокол определяет план методов, свойств и других требований , которые подходят для конкретной задачи или часть функциональности. Протокол затем может быть принят классом, структурой или перечислением , чтобы обеспечить фактическое выполнение этих требований. Любой тип , который удовлетворяет требованиям протокола, считается соответствующим протоколу .

Что эта функция capturePhoto просит вас сделать, так это передать объект, соответствующий протоколу. По соглашению мы называем это делегатом (думаем об этом как о серии функций, которые делегированы другому объекту).

Это по существу звонок. capturePhoto «знает» (потому что вы соответствуете протоколу), что делегат будет содержать функции, которые ему нужно вызвать, чтобы вы могли обработать изображение.

Чтобы успешно передать делегат, вам необходимо определить объект, который соответствует протоколу и передать экземпляр этого объекта функции в качестве делегата. Вы ДОЛЖНЫ объявить методы, которые вы собираетесь использовать из протокола. Вот частичный пример - не копируйте вставить это, вам нужно будет решить, что вам нужно для вашей реализации.

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 методы являются необязательными во время компиляции, которые должны быть реализованы, будет зависеть от того, какие настройки вы передаете реальные методы.

Какой метод делегата вызовы вывода фотографий зависят от настроек , с которыми вы начинаете захватывать. Все методы этого протокола необязательно во время компиляции, но во время выполнения вашего объект делегата должен реагировать на определенные методы в зависимости от ваших настроек фото:

Смежные вопросы