Как реализовать различные режимы или стили камеры в приложении камеры iOS с помощью контроллера просмотра страниц? ⇐ IOS
Как реализовать различные режимы или стили камеры в приложении камеры iOS с помощью контроллера просмотра страниц?
Этот код устанавливает базовую систему навигации на основе страниц для переключения между различными экземплярами filtercameraViewController. Если у вас есть конкретные вопросы или вам нужна дополнительная помощь по этому коду, дайте мне знать.
это мой код контроллера просмотра страниц для видов с камеры, таких как фотографические стили. ` импортировать UIKit импортировать AVFoundation
класс filterViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource { var cameraViewControllers: [UIViewController] = []
переопределить функцию viewDidLoad() { супер.viewDidLoad() self.dataSource = сам self.delegate = сам // Добавьте контроллеры представления камеры пусть camera1ViewController = filtercameraViewController() пусть camera2ViewController = filtercameraViewController() пусть camera3ViewController = filtercameraViewController() cameraViewControllers = [camera1ViewController, camera2ViewController, camera3ViewController] если let firstView = cameraViewControllers.first { setViewControllers([firstView], направление: .forward, анимация: true, завершение: ноль) } } // В фильтреViewController функция setPageSize() { // Устанавливаем размер страницы, соответствующий размеру filtercameraViewController пусть pageWidth = UIScreen.main.bounds.width let pageHeight = UIScreen.main.bounds.height/5.0 // Отрегулируйте по мере необходимости self.view.frame = CGRect(x: 0, y: 0, ширина: pageWidth, высота: pageHeight) } func pageViewController (_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { Guard let currentIndex = cameraViewControllers.firstIndex(of: (viewController as? filtercameraViewController)!) else { return nil } пусть предыдущийИндекс = ТекущийИндекс - 1 если предыдущийИндекс < 0 { вернуть ноль } вернуть cameraViewControllers[previousIndex] } func pageViewController (_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { Guard let currentIndex = cameraViewControllers.firstIndex(of: (viewController as? filtercameraViewController))!) else { return nil } пусть следующийИндекс = ТекущийИндекс + 1 если nextIndex >= cameraViewControllers.count { вернуть ноль } вернуть cameraViewControllers[nextIndex] } переопределить init (стиль переходаStyle: UIPageViewController.TransitionStyle, NavigationOrientation: UIPageViewController.NavigationOrientation, параметры: [UIPageViewController.OptionsKey: Any]? = ноль) { super.init(transitionStyle: .scroll, NavigationOrientation: .horizontal, параметры: ноль) } требуется инициализация?(кодер: NSCoder) { FatalError("init(coder:) не реализован") } }`
Код инициализирует вид камеры, настраивает камеру с помощью AVCaptureSession и добавляет в сеанс входные данные AVCaptureDevice и AVCapturePhotoOutput. Он также устанавливает слой предварительного просмотра для просмотра с камеры. `импортировать UIKit импортировать AVFoundation класс filtercameraViewController: cameraViewController { // вар CameraView: UIView! переопределить функцию viewDidLoad() { супер.viewDidLoad() cameraView = UIView () cameraView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(cameraView) //CameraView.backgroundColor = .black пусть X: CGFloat = 40,0 пусть Y: CGFloat = 40,0 // пусть X: CGFloat = 60.0 пусть x: CGFloat = 140,0 NSLayoutConstraint.activate([ cameraView.leadingAnchor.constraint(equalTo: view.leadingAnchor, константа: Y), cameraView.trailingAnchor.constraint(equalTo: view.trailingAnchor, константа: -Y), cameraView.topAnchor.constraint(equalTo: view.topAnchor, константа: X), cameraView.bottomAnchor.constraint(equalTo: view.bottomAnchor, константа: -x) ]) captureSession = AVCaptureSession() // captureSession.sessionPreset = currentAspectRatio если пусть устройство = AVCaptureDevice.default(for:.video) { делать { let input = попробуйте AVCaptureDeviceInput (устройство: устройство) if ((captureSession.canAddInput(input)) ) { captureSession.addInput(вход) } StillImageOutput = AVCapturePhotoOutput() // Инициализируем его как AVCapturePhotoOutput if ((captureSession.canAddOutput(stillImageOutput!))) { // Разворачиваем необязательный captureSession.addOutput(stillImageOutput!) } viewLayer = AVCaptureVideoPreviewLayer(session: captureSession!) cameraView?.layer.addSublayer(previewLayer) DispatchQueue.global(qos:.userInitiated).async { self.captureSession.startRunning() } } ловить { print("Ошибка настройки камеры: \(ошибка)") } } } } ` `` Код инициализирует вид камеры, настраивает камеру с помощью AVCaptureSession и добавляет в сеанс входные данные AVCaptureDevice и AVCapturePhotoOutput. Он также устанавливает слой предварительного просмотра для просмотра с камеры. Это основной класс моего кода, здесь есть кнопка для открытия страниц. после открытия страниц он может применить фильтры, которые я добавил в небольшой фрагмент кода. Думаю, для вас этого достаточно: импортировать UIKit импортировать AVFoundation импортировать фотографии импортировать CoreMotion класс cameraViewController: UIViewController, AVCapturePhotoCaptureDelegate, UIGestureRecouncerDelegate { вар cameraView: UIView! вар captureButton: UIButton! вар cameraSwitchButton: UIButton! вар flashModeButton: UIButton! вар captureSession: AVCaptureSession! вар StillImageOutput: AVCapturePhotoOutput! вар просмотр слоя: AVCaptureVideoPreviewLayer! вар currentZoomFactor: CGFloat = 1,0 вар maxZoomFactor: CGFloat = 5.0 вар ZoomStep: CGFloat = 1.0 var currentFlashMode: AVCaptureDevice.FlashMode = .auto // устанавливаем автоматический режим вспышки вар isFlashOn: Bool = ложь // varexpositionPoint = CGPoint(x: 0,5, y: 0,5) // var focusPoint = CGPoint(x: 0.5, y: 0.5) вар boxView: UIView! варexpositionSlider: UISlider! вар currentExposureBias: Float = 0,0 var currentFocusLevel: Float = 0.0 // вычисление вар motionManager: CMMotionManager! вар yawAngle: Double = 0,0 вар сегментированныйконтролл: UISegmentedControl! // элемент управления сегментом для выбора соотношения сторон var currentAspectRatio: AVCaptureSession.Preset = .hd1920x1080 // устанавливаем соотношение сторон по умолчанию в сеансе захвата вар timerButton: UIButton! вар timerDuration: TimeInterval = 0 вар timerLabel: UILabel! вар таймер: Таймер? вар styleButton: UIButton! вар-устройство: AVCaptureDevice! вар LastManualExposureValue: Float = 0,0 индекс вар: Int = 0 // вар pageViewController: UIPageViewController! вар isStyleViewActive = ложь var cameraViewControllers: [cameraViewController] = [] переопределить функцию viewDidLoad() { супер.viewDidLoad() настройкаКамераВью() настройкаКамера() НастройкаКнопки() настройкаBoxView() настройкаExposureSlider() настройкаЖесты() настройкаMotionManager() // настройкаКамеры() } //он использовался для скрытия строки состояния на дисплее, например: статус батареи, сигнал переопределить var предпочитаетStatusBarHidden: Bool{ вернуть истину } переопределить var supportInterfaceOrientations: UIInterfaceOrientationMask { вернуть .портрет } переопределить func viewDidAppear(_animated: Bool) { super.viewDidAppear(анимированный) PreviewLayer?.connection?.videoOrientation = currentVideoOrientation() PreviewLayer?.frame = cameraView.bounds // предварительный просмотрLayer.videoGravity = .resizeAspect } переопределить func viewWillTransition(to size: CGSize, с координатором: UIViewControllerTransitionCoordinator) { } функция setupCameraView() { камераView = UIView() cameraView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(cameraView) NSLayoutConstraint.activate([ cameraView.leadingAnchor.constraint(equalTo: view.leadingAnchor), cameraView.trailingAnchor.constraint(equalTo: view.trailingAnchor), cameraView.topAnchor.constraint(equalTo: view.topAnchor), cameraView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) } функция setupCamera() { captureSession = AVCaptureSession() captureSession.sessionPreset = currentAspectRatio если пусть устройство = AVCaptureDevice.default(for:.video) { делать { let input = попробуйте AVCaptureDeviceInput (устройство: устройство) if ((captureSession.canAddInput(input)) ) { captureSession.addInput(вход) } StillImageOutput = AVCapturePhotoOutput() // Инициализируем его как AVCapturePhotoOutput if ((captureSession.canAddOutput(stillImageOutput!))) { // Разворачиваем необязательный captureSession.addOutput(stillImageOutput!) } viewLayer = AVCaptureVideoPreviewLayer(session: captureSession!) cameraView?.layer.addSublayer(previewLayer) DispatchQueue.global(qos:.userInitiated).async { self.captureSession.startRunning() } } ловить { print("Ошибка настройки камеры: \(ошибка)") } } } ` `` `` Я создал приложение камеры iOS с видом основной камеры и хочу добавить поддержку различных режимов или стилей камеры, аналогичных стилям фотографии в iPhone 13. Каждый режим должен иметь свой набор настроек камеры и элементов пользовательского интерфейса. Как лучше всего реализовать эту функцию в моем приложении для iOS? Можете ли вы предоставить какие-либо рекомендации или примеры кода о том, как создавать различные режимы камеры и переключаться между ними? Мне нужен совет по общей архитектуре и тому, как эффективно управлять настройками камеры и переходами пользовательского интерфейса между режимами. Будем очень признательны за любые советы, фрагменты кода или ссылки на соответствующую документацию. Спасибо!
Этот код устанавливает базовую систему навигации на основе страниц для переключения между различными экземплярами filtercameraViewController. Если у вас есть конкретные вопросы или вам нужна дополнительная помощь по этому коду, дайте мне знать.
это мой код контроллера просмотра страниц для видов с камеры, таких как фотографические стили. ` импортировать UIKit импортировать AVFoundation
класс filterViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource { var cameraViewControllers: [UIViewController] = []
переопределить функцию viewDidLoad() { супер.viewDidLoad() self.dataSource = сам self.delegate = сам // Добавьте контроллеры представления камеры пусть camera1ViewController = filtercameraViewController() пусть camera2ViewController = filtercameraViewController() пусть camera3ViewController = filtercameraViewController() cameraViewControllers = [camera1ViewController, camera2ViewController, camera3ViewController] если let firstView = cameraViewControllers.first { setViewControllers([firstView], направление: .forward, анимация: true, завершение: ноль) } } // В фильтреViewController функция setPageSize() { // Устанавливаем размер страницы, соответствующий размеру filtercameraViewController пусть pageWidth = UIScreen.main.bounds.width let pageHeight = UIScreen.main.bounds.height/5.0 // Отрегулируйте по мере необходимости self.view.frame = CGRect(x: 0, y: 0, ширина: pageWidth, высота: pageHeight) } func pageViewController (_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { Guard let currentIndex = cameraViewControllers.firstIndex(of: (viewController as? filtercameraViewController)!) else { return nil } пусть предыдущийИндекс = ТекущийИндекс - 1 если предыдущийИндекс < 0 { вернуть ноль } вернуть cameraViewControllers[previousIndex] } func pageViewController (_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { Guard let currentIndex = cameraViewControllers.firstIndex(of: (viewController as? filtercameraViewController))!) else { return nil } пусть следующийИндекс = ТекущийИндекс + 1 если nextIndex >= cameraViewControllers.count { вернуть ноль } вернуть cameraViewControllers[nextIndex] } переопределить init (стиль переходаStyle: UIPageViewController.TransitionStyle, NavigationOrientation: UIPageViewController.NavigationOrientation, параметры: [UIPageViewController.OptionsKey: Any]? = ноль) { super.init(transitionStyle: .scroll, NavigationOrientation: .horizontal, параметры: ноль) } требуется инициализация?(кодер: NSCoder) { FatalError("init(coder:) не реализован") } }`
Код инициализирует вид камеры, настраивает камеру с помощью AVCaptureSession и добавляет в сеанс входные данные AVCaptureDevice и AVCapturePhotoOutput. Он также устанавливает слой предварительного просмотра для просмотра с камеры. `импортировать UIKit импортировать AVFoundation класс filtercameraViewController: cameraViewController { // вар CameraView: UIView! переопределить функцию viewDidLoad() { супер.viewDidLoad() cameraView = UIView () cameraView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(cameraView) //CameraView.backgroundColor = .black пусть X: CGFloat = 40,0 пусть Y: CGFloat = 40,0 // пусть X: CGFloat = 60.0 пусть x: CGFloat = 140,0 NSLayoutConstraint.activate([ cameraView.leadingAnchor.constraint(equalTo: view.leadingAnchor, константа: Y), cameraView.trailingAnchor.constraint(equalTo: view.trailingAnchor, константа: -Y), cameraView.topAnchor.constraint(equalTo: view.topAnchor, константа: X), cameraView.bottomAnchor.constraint(equalTo: view.bottomAnchor, константа: -x) ]) captureSession = AVCaptureSession() // captureSession.sessionPreset = currentAspectRatio если пусть устройство = AVCaptureDevice.default(for:.video) { делать { let input = попробуйте AVCaptureDeviceInput (устройство: устройство) if ((captureSession.canAddInput(input)) ) { captureSession.addInput(вход) } StillImageOutput = AVCapturePhotoOutput() // Инициализируем его как AVCapturePhotoOutput if ((captureSession.canAddOutput(stillImageOutput!))) { // Разворачиваем необязательный captureSession.addOutput(stillImageOutput!) } viewLayer = AVCaptureVideoPreviewLayer(session: captureSession!) cameraView?.layer.addSublayer(previewLayer) DispatchQueue.global(qos:.userInitiated).async { self.captureSession.startRunning() } } ловить { print("Ошибка настройки камеры: \(ошибка)") } } } } ` `` Код инициализирует вид камеры, настраивает камеру с помощью AVCaptureSession и добавляет в сеанс входные данные AVCaptureDevice и AVCapturePhotoOutput. Он также устанавливает слой предварительного просмотра для просмотра с камеры. Это основной класс моего кода, здесь есть кнопка для открытия страниц. после открытия страниц он может применить фильтры, которые я добавил в небольшой фрагмент кода. Думаю, для вас этого достаточно: импортировать UIKit импортировать AVFoundation импортировать фотографии импортировать CoreMotion класс cameraViewController: UIViewController, AVCapturePhotoCaptureDelegate, UIGestureRecouncerDelegate { вар cameraView: UIView! вар captureButton: UIButton! вар cameraSwitchButton: UIButton! вар flashModeButton: UIButton! вар captureSession: AVCaptureSession! вар StillImageOutput: AVCapturePhotoOutput! вар просмотр слоя: AVCaptureVideoPreviewLayer! вар currentZoomFactor: CGFloat = 1,0 вар maxZoomFactor: CGFloat = 5.0 вар ZoomStep: CGFloat = 1.0 var currentFlashMode: AVCaptureDevice.FlashMode = .auto // устанавливаем автоматический режим вспышки вар isFlashOn: Bool = ложь // varexpositionPoint = CGPoint(x: 0,5, y: 0,5) // var focusPoint = CGPoint(x: 0.5, y: 0.5) вар boxView: UIView! варexpositionSlider: UISlider! вар currentExposureBias: Float = 0,0 var currentFocusLevel: Float = 0.0 // вычисление вар motionManager: CMMotionManager! вар yawAngle: Double = 0,0 вар сегментированныйконтролл: UISegmentedControl! // элемент управления сегментом для выбора соотношения сторон var currentAspectRatio: AVCaptureSession.Preset = .hd1920x1080 // устанавливаем соотношение сторон по умолчанию в сеансе захвата вар timerButton: UIButton! вар timerDuration: TimeInterval = 0 вар timerLabel: UILabel! вар таймер: Таймер? вар styleButton: UIButton! вар-устройство: AVCaptureDevice! вар LastManualExposureValue: Float = 0,0 индекс вар: Int = 0 // вар pageViewController: UIPageViewController! вар isStyleViewActive = ложь var cameraViewControllers: [cameraViewController] = [] переопределить функцию viewDidLoad() { супер.viewDidLoad() настройкаКамераВью() настройкаКамера() НастройкаКнопки() настройкаBoxView() настройкаExposureSlider() настройкаЖесты() настройкаMotionManager() // настройкаКамеры() } //он использовался для скрытия строки состояния на дисплее, например: статус батареи, сигнал переопределить var предпочитаетStatusBarHidden: Bool{ вернуть истину } переопределить var supportInterfaceOrientations: UIInterfaceOrientationMask { вернуть .портрет } переопределить func viewDidAppear(_animated: Bool) { super.viewDidAppear(анимированный) PreviewLayer?.connection?.videoOrientation = currentVideoOrientation() PreviewLayer?.frame = cameraView.bounds // предварительный просмотрLayer.videoGravity = .resizeAspect } переопределить func viewWillTransition(to size: CGSize, с координатором: UIViewControllerTransitionCoordinator) { } функция setupCameraView() { камераView = UIView() cameraView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(cameraView) NSLayoutConstraint.activate([ cameraView.leadingAnchor.constraint(equalTo: view.leadingAnchor), cameraView.trailingAnchor.constraint(equalTo: view.trailingAnchor), cameraView.topAnchor.constraint(equalTo: view.topAnchor), cameraView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) } функция setupCamera() { captureSession = AVCaptureSession() captureSession.sessionPreset = currentAspectRatio если пусть устройство = AVCaptureDevice.default(for:.video) { делать { let input = попробуйте AVCaptureDeviceInput (устройство: устройство) if ((captureSession.canAddInput(input)) ) { captureSession.addInput(вход) } StillImageOutput = AVCapturePhotoOutput() // Инициализируем его как AVCapturePhotoOutput if ((captureSession.canAddOutput(stillImageOutput!))) { // Разворачиваем необязательный captureSession.addOutput(stillImageOutput!) } viewLayer = AVCaptureVideoPreviewLayer(session: captureSession!) cameraView?.layer.addSublayer(previewLayer) DispatchQueue.global(qos:.userInitiated).async { self.captureSession.startRunning() } } ловить { print("Ошибка настройки камеры: \(ошибка)") } } } ` `` `` Я создал приложение камеры iOS с видом основной камеры и хочу добавить поддержку различных режимов или стилей камеры, аналогичных стилям фотографии в iPhone 13. Каждый режим должен иметь свой набор настроек камеры и элементов пользовательского интерфейса. Как лучше всего реализовать эту функцию в моем приложении для iOS? Можете ли вы предоставить какие-либо рекомендации или примеры кода о том, как создавать различные режимы камеры и переключаться между ними? Мне нужен совет по общей архитектуре и тому, как эффективно управлять настройками камеры и переходами пользовательского интерфейса между режимами. Будем очень признательны за любые советы, фрагменты кода или ссылки на соответствующую документацию. Спасибо!
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
.NET MAUI: светлый и темный режимы не обновляются должным образом на платформе iOS.
Anonymous » » в форуме IOS - 0 Ответы
- 82 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как изменить режимы, распечатав их, без горячих клавиш в Рофи? [закрыто]
Anonymous » » в форуме Linux - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-