Paparazzo - https://github.com/avito-tech/Paparazzo
В своём докладе Андрей поделится опытом разработки собственной камеры и галереи в приложении Avito и расскажет про проблемы, с которыми столкнулся в процессе. Из доклада вы узнаете:
- как реализовать вывод изображения с камеры в нескольких view одновременно
- как оптимизировать работу с памятью при работе с картинками
- как абстрагироваться от источника картинки
- как обработать изображения с помощью фрэймворка ImageIO
- как абстрагироваться от UIKit в слое Presenter архитектуры VIPER
- как работать с изображениями из iCloud и про другие скользкие моменты фрэймворка Photos.
24. Отображение превью
let layer = AVCaptureVideoPreviewLayer(session: captureSession)
cameraOutputView.layer.addSublayer(layer)
9
Несколько AVCaptureSession не могут работать одновременно
1 AVCaptureSession = 1 AVCaptureVideoPreviewLayer
63. Отображение в UI
let viewSize: CGSize
let contentMode: ContentMode // enum: aspectFit/aspectFill
19
64. Отображение в UI
let viewSize: CGSize
let contentMode: ContentMode // enum: aspectFit/aspectFill
let handler = { (image: UIImage?) in
imageView.image = image
}
19
65. Отображение в UI
let viewSize: CGSize
let contentMode: ContentMode // enum: aspectFit/aspectFill
let handler = { (image: UIImage?) in
imageView.image = image
}
let deliveryMode: DeliveryMode // enum: progressive/best
19
81. resultHandler после отмены запроса
PHImageManager
иногда вызывается, иногда — нет
иногда приходит UIImage, иногда — нет
27
82. resultHandler после отмены запроса
PHImageManager
иногда вызывается, иногда — нет
иногда приходит UIImage, иногда — нет
ImageSource для PHAsset
не вызывается
27
83. resultHandler после отмены запроса
Отменен ли запрос?
// внутри resultHandler PHImageManager’а
let cancelled =
(info?[PHImageCancelledKey] as? NSNumber)?.boolValue ?? false
|| cancelledRequestIds.contains(requestId)
if !cancelled {
// вызываем "внешний" resultHandler
}
28
84. resultHandler после отмены запроса
Отменен ли запрос?
// внутри resultHandler PHImageManager’а
let cancelled =
(info?[PHImageCancelledKey] as? NSNumber)?.boolValue ?? false
|| cancelledRequestIds.contains(requestId)
if !cancelled {
// вызываем "внешний" resultHandler
}
28
85. resultHandler после отмены запроса
Отменен ли запрос?
// внутри resultHandler PHImageManager’а
let cancelled =
(info?[PHImageCancelledKey] as? NSNumber)?.boolValue ?? false
|| cancelledRequestIds.contains(requestId)
if !cancelled {
// вызываем "внешний" resultHandler
}
28
107. Images & memory
для операций над изображениями — Core Image, ImageIO
создавайте UIImage минимально необходимого размера
35
108. Images & memory
для операций над изображениями — Core Image, ImageIO
создавайте UIImage минимально необходимого размера
не храните больше UIImage, чем помещается на экране
35