iOS/Swift 어플 따라하기

[Swift] Camera App 3(내부,외부 카메라 toggle button)

Chafle 2022. 4. 14. 10:49
반응형
오늘의 할일
1. 반대 카메라 찾기(내부, 외부 카메라)
2. 새로운 디바이스를 가지고 session업데이트
3. 토글버튼 업데이트

 

 

오늘은 토글버튼을 통해서 카메라 외/내부 카메라 전환을 해보겠습니다.

 

 

1. 반대 카메라 찾기

sessionQueue.async {

            let currentVideoDevice = self.videoDeviceInput.device

//현재 잡혀진 카메라 디바이스를 찾습니다.

            let currentPosition = currentVideoDevice.position

//앞카메라인지 뒤카메라인지 할당해줍니다

            let isFront = currentPosition == .front

// 앞 카메라인지 할당해줍니다.

            let preferredPosition: AVCaptureDevice.Position = isFront ? .back : .front

//현재카메라가 앞이면 뒤카메라 가져와야되고 현재카메라가 뒤면 앞카메라 가져오라는 명령입니다.

            let devices = self.videoDeviceDiscoverySession.devices

            var newVideoDevice: AVCaptureDevice?   

            newVideoDevice = devices.first(where: { device in

                return preferredPosition == device.position

//videoDeviceDiscoverySession에 있는 디바이스중에서 해당하는 포지션에있는 카메라를 찾아서 첫번째 거를 뉴디바이스에 세팅해줍니다.

            })

 

 

2. 새로운 디바이스를 가지고 session업데이트

 if let newDevice = newVideoDevice {

                do {

                let videoDeviceInput = try AVCaptureDeviceInput(device: newDevice)

                    self.captureSession.beginConfiguration()

                    self.captureSession.removeInput(self.videoDeviceInput)

 //지난시간과 마찬가지로 세션에 넣을 때는 if문으로 물어보고 넣어야합니다.

                    if self.captureSession.canAddInput(videoDeviceInput) {

                        self.captureSession.addInput(videoDeviceInput)

                        self.videoDeviceInput = videoDeviceInput

 // 새로운 디바이스 인풋 넣어 줍니다.

                    } else {

                        self.captureSession.addInput(self.videoDeviceInput)

// 없으면 기존에 있던 것 다시 넣겠다는 코드입니다.

                    }

                    self.captureSession.commitConfiguration()

            } catch let error  {

print("error occured while creating device input: \(error.localizedDescription)")

            }

          }

 

 

3. 토글버튼 업데이트 

 

func updateSwitchCameraIcon(position: AVCaptureDevice.Position) {

        switch position {

        case .front:

            let image =  imageLiteral(resourceName: "ic_camera_front")

            switchButton.setImage(image, for: .normal)

        case .back:

            let image =  imageLiteral(resourceName: "ic_camera_rear")

            switchButton.setImage(image, for: .normal)

        default:

            break

        }

    }

 

반응형