如何使用页面视图控制器在我的 iOS 相机应用程序中实现不同的相机模式或样式

How can I implement different camera modes or styles in my iOS camera app using pageview controller

提问人:ManojkumarS 提问时间:10/3/2023 最后编辑:ManojkumarS 更新时间:10/16/2023 访问量:38

问:

此代码设置了一个基本的基于页面的导航系统,用于在 filtercameraViewController 的不同实例之间切换。如果您有具体问题或需要有关此代码的进一步帮助,请告诉我。

这是我的页面视图控制器代码,用于相机视图,如摄影风格。

import UIKit
import AVFoundation

class filterViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
    var cameraViewControllers: [UIViewController] = []
 
  
    override func viewDidLoad() {
        super.viewDidLoad()

        self.dataSource = self
        self.delegate = self

        // Add your camera view controllers
       
        let camera1ViewController = filtercameraViewController()
    
      

        let camera2ViewController = filtercameraViewController()
 

        let camera3ViewController = filtercameraViewController()


        cameraViewControllers = [camera1ViewController, camera2ViewController, camera3ViewController]
        
    

        if let firstView = cameraViewControllers.first {
            setViewControllers([firstView], direction: .forward, animated: true, completion: nil)
        }

    }
    // In filterViewController
  
   
    func setPageSize() {
           // Set the page size to match the size of filtercameraViewController
           let pageWidth = UIScreen.main.bounds.width
           let pageHeight = UIScreen.main.bounds.height / 5.0 // Adjust as needed
           
           self.view.frame = CGRect(x: 0, y: 0, width: pageWidth, height: pageHeight)
       }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        guard let currentIndex = cameraViewControllers.firstIndex(of: (viewController as? filtercameraViewController)!  ) else { return nil }
        let previousIndex = currentIndex - 1
        if previousIndex < 0 {
            return nil
        }
        return cameraViewControllers[previousIndex]
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard let currentIndex = cameraViewControllers.firstIndex(of: (viewController as? filtercameraViewController)!) else { return nil }
        let nextIndex = currentIndex + 1
        if nextIndex >= cameraViewControllers.count {
            return nil
        }
        return cameraViewControllers[nextIndex]
    }

    override init(transitionStyle style: UIPageViewController.TransitionStyle, navigationOrientation: UIPageViewController.NavigationOrientation, options: [UIPageViewController.OptionsKey: Any]? = nil) {
        super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
   
}

该代码初始化相机视图,使用 AVCaptureSession 设置相机,并将 AVCaptureDevice 输入和 AVCapturePhotoOutput 添加到会话中。它还为相机视图设置了一个预览图层。

import UIKit
import AVFoundation

class filtercameraViewController: cameraViewController {
    
  //  var CameraView : UIView!
    
  
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
       
         
         
         cameraView = UIView ()
         cameraView.translatesAutoresizingMaskIntoConstraints = false
         view.addSubview(cameraView)
//CameraView.backgroundColor = .black
         let X: CGFloat = 40.0
         let Y: CGFloat = 40.0
       //  let X: CGFloat = 60.0
         let x : CGFloat = 140.0
         
         NSLayoutConstraint.activate([
         cameraView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant:  Y),
         cameraView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -Y),
         cameraView.topAnchor.constraint(equalTo: view.topAnchor, constant: X),
         cameraView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -x)
         
        ])
        
              captureSession = AVCaptureSession()
         //     captureSession.sessionPreset = currentAspectRatio
              
              if let device = AVCaptureDevice.default(for: .video) {
                  do {
                      let input = try AVCaptureDeviceInput(device: device)
                      if ((captureSession.canAddInput(input)) ) {
                          captureSession.addInput(input)
                      }
                      
                      stillImageOutput = AVCapturePhotoOutput() // Initialize it as an AVCapturePhotoOutput
                      if ((captureSession.canAddOutput(stillImageOutput!))) { // Unwrap the optional
                          captureSession.addOutput(stillImageOutput!)
                      }
                      
                      previewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
                      
                      cameraView?.layer.addSublayer(previewLayer)
                      
                      DispatchQueue.global(qos: .userInitiated).async {
                          self.captureSession.startRunning()
                      }
                  } catch {
                      print("Error setting up camera: \(error)")
                  }
              }
          
        
         }
         
         
         

    
        
        
    }

这是我代码的主要类,在这里是打开页面的按钮。打开页面后,它可以应用我放置的一小段代码的过滤器..我认为这对你来说已经足够了:

import UIKit
import AVFoundation
import Photos
import CoreMotion

class cameraViewController: UIViewController,AVCapturePhotoCaptureDelegate,  UIGestureRecognizerDelegate {
    
    
    
    var cameraView: UIView!
    var captureButton: UIButton!
    var cameraSwitchButton: UIButton!
    var flashModeButton: UIButton!
    
    var captureSession: AVCaptureSession!
    var stillImageOutput: AVCapturePhotoOutput!
    var previewLayer: AVCaptureVideoPreviewLayer!
    var currentZoomFactor: CGFloat = 1.0
    var maxZoomFactor: CGFloat = 5.0
    var zoomStep: CGFloat = 1.0
    var currentFlashMode: AVCaptureDevice.FlashMode = .auto // set flash mode on auto
    var isFlashOn: Bool = false
    // var exposurePoint = CGPoint(x: 0.5, y: 0.5)
    //  var focusPoint = CGPoint(x: 0.5, y: 0.5)
    var boxView: UIView!
    var exposureSlider: UISlider!
    var currentExposureBias: Float = 0.0
    var currentFocusLevel: Float = 0.0 // calculate
    var motionManager: CMMotionManager!
    var yawAngle: Double = 0.0
    var segmentedControll : UISegmentedControl! // segment controll for select a aspect ratio
    var currentAspectRatio: AVCaptureSession.Preset = .hd1920x1080 // set default aspet ratio on capture session
    
    var timerButton : UIButton!
    var timerDuration: TimeInterval = 0
    var timerLabel: UILabel!
    var timer : Timer?
    
    var styleButton : UIButton!
    
    var device : AVCaptureDevice!
    
    var lastManualExposureValue: Float = 0.0
    
    var index : Int = 0
    
    //   var pageViewController: UIPageViewController!
    
    var isStyleViewActive = false
    
    var cameraViewControllers: [cameraViewController] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupCameraView()
        setupCamera()
        setupButtons()
        setupBoxView()
        setupExposureSlider()
        setupGestures()
        setupMotionManager()
        // configureCamera()
        
        
        
    }
    
    
    //it was using for hide status bar on display eg:battery status,singnal
    override  var prefersStatusBarHidden: Bool{
        return true
    }
    
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
    
    
    
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        previewLayer?.connection?.videoOrientation = currentVideoOrientation()
        previewLayer?.frame = cameraView.bounds
        
        // previewLayer.videoGravity = .resizeAspect
        
    }
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    }
    
    
    
    
    
    func setupCameraView() {
        cameraView = 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)
        ])
    }
    
   
    func setupCamera() {
        captureSession = AVCaptureSession()
        captureSession.sessionPreset = currentAspectRatio
        
        if let device = AVCaptureDevice.default(for: .video) {
            do {
                let input = try AVCaptureDeviceInput(device: device)
                if ((captureSession.canAddInput(input)) ) {
                    captureSession.addInput(input)
                }
                
                stillImageOutput = AVCapturePhotoOutput() // Initialize it as an AVCapturePhotoOutput
                if ((captureSession.canAddOutput(stillImageOutput!))) { // Unwrap the optional
                    captureSession.addOutput(stillImageOutput!)
                }
                
                previewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
                
                cameraView?.layer.addSublayer(previewLayer)
                
                DispatchQueue.global(qos: .userInitiated).async {
                    self.captureSession.startRunning()
                }
            } catch {
                print("Error setting up camera: \(error)")
            }
        }
    }

我创建了一个带有主相机视图的 iOS 相机应用程序,我想添加对不同相机模式或风格的支持,类似于 iPhone 13 中的摄影风格。每种模式都应有自己的一组相机设置和 UI 元素。

在我的 iOS 应用中实现此功能的最佳方式是什么?您能否提供一些有关如何创建不同的相机模式并在它们之间切换的指导或代码示例?

我正在寻找有关整体架构以及如何有效处理模式之间的相机设置和 UI 转换的建议。任何提示、代码片段或对相关文档的引用将不胜感激。

iOS Swift UIPageViewController IOS 相机

评论

0赞 Community 10/15/2023
请编辑问题,将其限制在特定问题上,并具有足够的细节以确定适当的答案。

答: 暂无答案