Я пытаюсь имитировать переход приложения «Камера» с передней на заднюю камеру ... он использует UIViewAnimationOptionTransitionFlipFromLeft ..
Мой текущий метод состоит в том, чтобы сделать снимок с передней камеры, переключиться на заднюю камеру, сделать снимок с задней камеры, загрузить их в два UIImageViews и выполнить переход с изображениями .. (скрывая текущий поток камеры) в процессе) ..
Проблема в том, что когда я делаю вызов, чтобы переключиться с передней камеры на заднюю камеру, CameraView (AVCapturePreviewLayer) мгновенно переключает представление, прежде чем я могу его скрыть (это происходит в flipCameraToFront на последней строке .. [_captureSession commitConfiguration]) ...
Надеюсь, это имеет смысл, вот часть кода, который я пропустил, если вы думаете, что это поможет, дайте мне знать, а я опубликую остальную часть.
Любая помощь будет принята с благодарностью, спасибо
//class:RecordViewController
//iVars for this class..
RecordVideoHandler *_recordHandler;
UIImage *_firstImageForFlip;
UIImage *_secondImageForFlip;
UIImageView *_firstImageViewForFlip;
BOOL isUsingFrontInput;
AVCaptureVideoPreviewLayer *_capturePreviewLayer;
UIView *_capturePreviewView;
- (void)doCameraFlip:(UIButton *)sender
{
[_recordHandler addStillImageOutput];
//This method calls imageReturned:(UIImage *)inImage;
[_recordHandler captureAndReturnStillImage];
}
- (void)imageReturned:(UIImage *)inImage{
if(_firstImageForFlip == nil){
[_capturePreviewLayer setFrame:CGRectZero];
_firstImageForFlip = inImage;
_firstImageViewForFlip = [[UIImageView alloc] initWithImage:_firstImageForFlip];
if(isUsingFrontInput)
[_firstImageViewForFlip setTransform:CGAffineTransformMakeScale(-1.0, 1.0)];
[_firstImageViewForFlip setFrame:_capturePreviewView.bounds];
[_capturePreviewView addSubview:_firstImageViewForFlip];
if(isUsingFrontInput){
[_recordHandler flipCameraToBack];
}else{
[_recordHandler flipCameraToFront];
}
[_recordHandler captureAndReturnStillImage];
}else{
_secondImageForFlip = inImage;
[_recordHandler removeStillImageOutput];
[self finishCameraFlip];
}
}
- (void)finishCameraFlip{
UIImageView *secondImageView = [[UIImageView alloc] initWithImage:_secondImageForFlip];
[secondImageView setFrame:_capturePreviewView.bounds];
if(!isUsingFrontInput)
[secondImageView setTransform:CGAffineTransformMakeScale(-1.0, 1.0)];
[UIView transitionWithView:_capturePreviewView duration:3.3f
options:UIViewAnimationOptionTransitionFlipFromLeft animations:
^{
[_firstImageViewForFlip removeFromSuperview];
[_capturePreviewLayer setFrame:_capturePreviewView.bounds];
[_capturePreviewView addSubview:secondImageView];
} completion:
^(BOOL finished){
[secondImageView removeFromSuperview];
}];
isUsingFrontInput = isUsingFrontInput ? NO : YES;
_firstImageForFlip = nil;
_secondImageForFlip = nil;
}
Класс: RecordVideoHandler
//iVars for this class..
AVCaptureSession *_captureSession;
- (void)flipCameraToFront
{
[_captureSession beginConfiguration];
for (AVCaptureInput *input in _captureSession.inputs) {
if (input == _captureRearInput) {
[_captureSession removeInput:_captureRearInput];
[_captureSession addInput:_captureFrontInput];
}
}
_currentCaptureDevice = _captureDeviceFrontFacing;
[_captureSession commitConfiguration];
}