Приложение камеры iOS, мерцание при переключении с передней на заднюю камеру - PullRequest
2 голосов
/ 30 января 2012

Я пытаюсь имитировать переход приложения «Камера» с передней на заднюю камеру ... он использует 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];
}

1 Ответ

6 голосов
/ 30 января 2012

Если кому-то было интересно, я понял это. Мне пришлось использовать executeSelectors, чтобы дождаться следующего цикла выполнения, потому что камера мгновенно перевернулась, в то время как материал представления ждал после цикла выполнения или чего-то ... не уверен в специфике, вот код.

- (void)doCameraFlip:(UIButton *)sender
{
    NSLog(@"doCameraFlip");
    [_recordHandler addStillImageOutput];    
    [_recordHandler captureAndReturnStillImage];    
}
- (void)imageReturned:(UIImage *)inImage{
    [_recordHandler removeStillImageOutput];            
    _imageViewForFlip= [[UIImageView alloc] initWithImage:inImage];
    [_imageViewForFlip setFrame:_containerView.bounds];
    [_containerView addSubview:_imageViewForFlip];


    [self performSelector:@selector(cfe) withObject:nil afterDelay:0.0f];
    [self performSelector:@selector(cfe2) withObject:nil afterDelay:0.0f];

}
- (void)cfe{
    if(isUsingFrontInput){
        [_recordHandler flipCameraToBack];
    }else{
        [_recordHandler flipCameraToFront];
    }

}
- (void)cfe2{
    [UIView transitionWithView:_containerView duration:3.0f options:UIViewAnimationOptionTransitionFlipFromRight animations:^{
        [_imageViewForFlip removeFromSuperview]; 
        [_containerView addSubview:_capturePreviewView]; 
    } completion:nil];
}
...