Я пытаюсь создать пользовательский CameraView, который работает до сих пор. Однако я столкнулся с проблемой переключения между передней и задней камерами. Я попытался обработать это через пользовательское перечисление. Однако, когда вызывается метод switchCamera
. это просто замораживает камеру? Почему так?Переключение между передней и задней камерами
камеры Переменная
var camera = CameraType.Back
viewDidLoad
switchButton = UIButton(frame: CGRectMake(rightButtonXPoint, 35, 30, 30))
switchButton.setImage(UIImage(named: "Switch"), forState: UIControlState.Normal)
switchButton.addTarget(self, action: "switchCamera", forControlEvents: UIControlEvents.TouchUpInside)
actionView.addSubview(switchButton)
ViewWillAppear
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
reloadCamera()
}
SwitchCamera
func switchCamera() {
if camera == CameraType.Back {
camera = CameraType.Front
} else {
camera = CameraType.Back
}
reloadCamera()
}
ReloadCamera
func reloadCamera() {
captureSession = AVCaptureSession()
// let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
var captureDevice:AVCaptureDevice! = nil
if (camera == CameraType.Front) {
let videoDevices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
for device in videoDevices{
let device = device as! AVCaptureDevice
if device.position == AVCaptureDevicePosition.Front {
captureDevice = device
break
}
}
} else {
captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
}
do {
let input = try? AVCaptureDeviceInput(device: captureDevice)
if (captureSession?.canAddInput(input) != nil){
captureSession?.addInput(input)
stillImageOutput = AVCaptureStillImageOutput()
stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]
if (captureSession?.canAddOutput(stillImageOutput) != nil){
captureSession?.addOutput(stillImageOutput)
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer?.videoGravity = AVLayerVideoGravityResizeAspect
previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.Portrait
cameraView.layer.addSublayer(previewLayer!)
captureSession?.startRunning()
}
cameraView.bringSubviewToFront(actionView)
previewImageView.bringSubviewToFront(actionView)
self.previewImageView.hidden = true
}
}
}
Я не вижу, где вы когда-либо называли 'switchCamera', так где же проблема на самом деле возникает? Вы просто называете это smack в середине, пока идет захват уже? Если это так, это ваша проблема; это некогерентная вещь. – matt
Я добавил кнопку в представление, которое вызывает 'switchCamera'. Я добавил код сейчас –
Хорошо, но, как я уже говорил, вы не можете просто выкинуть сеанс захвата и заменить его таким образом. Вы не прекращаете сеанс. Вы не заменяете слой предварительного просмотра в интерфейсе. Это некогерентно. – matt