Создание кастомной камеры на Swift
В один прекрасный день передо мной встала задача сделать кастомную камеру, скажу вам так это задача не из легких, пришлось познакмиться с разными интересными и не очень вещами. Поэтому если хотите сделать свое приложение уникальным с помошью кастомной камеры, то эта статья для вас. Here we go!!
Начнем с того, какой финальный результат мы получим.
Как видно на скриншоте мы будем иметь кастомную камеру, возможность переходить в галерею и фанарик которым мы будем освещать при необходимости пространство перед нами. Прекрасно помоему)
Пример будет на архитектуре MVC. Начнем с добавления всех вьюшек который нам понадобятся для нашего экрана:
Давайте по порядку:
cameraView — это как раз вьюшка через которую мы будем видеть окно камеры.
photoImageView — это вьюшка отвечает за фото сделанное последний раз в нижнем левом углу на скриншоте, по нажатию на нее будем открывть список всех фото.
takePhotoButton — кнопка которая делает фотографию.
cameraFlashButton — наша кастомная вспышка)
dismissButton — скрывает экран, так у нас пример модального экрана.
Далее сделаем настройки наших вьюшек:
И настроим расположение:
Переходим непросредственно, к созданию главных объектов и переменных которые нам будут необходимы:
AVCaptureVideoPreviewLayer - Слой Core Animation, отображающий видео с камеры.
AVCaptureSession — Объект, который настраивает поведение захвата и координирует поток данных от устройств.
AVCapturePhotoOutput — предоставляет интерфейс для рабочих процессов захвата, связанных с фотосъемкой. В дополнение к базовому захвату неподвижных изображений, вывод фотографий, поддерживает захват в формате RAW, захват нескольких изображений, Live Photos и широкий цветовой охват. Вы можете выводить захваченные фотографии в различных форматах и кодеках, включая файлы DNG в формате RAW, файлы HEIF в формате HEVC и файлы JPEG.
cameraessionQueue — это очередь которую мы создаем для того чтобы в ней выполнять операции которые требуют определенного времени например AVCaptureSession.startRunning()
Метод startRunning() является блокирующим вызовом, который может занять некоторое время, поэтому начните сеанс в очереди последовательной отправки, чтобы не блокировать основную очередь (которая сохраняет отзывчивость пользовательского интерфейса).
isCameraFlashEnabled — просто переключатель для работы с камерой
Также нам будет необходимо сделать импорт нужных библиотек, а то пока Xcode не понимает что происходит)
Давайте сделаем базовые настройки для наших объектов:
maxPhotoQualityPrioritization имеет несколько вариантов, вам нужно выбрать то, что вам особенно нужно:
Из документации Apple
case speed
Скорость доставки фотографий важнее всего, даже в ущерб качеству.
case quality
Качество фотографий важнее всего, даже в ущерб времени от снимка к снимку.
case balanced
Приоритет сбалансирован между качеством фото и скоростью доставки.
Cсылки: