的iOS相机应用程序,闪烁时,相机背面
问题描述:
我试图从正面模仿相机的应用过渡到后置摄像头。它采用了UIViewAnimationOptionTransitionFlipFromLeft ..的iOS相机应用程序,闪烁时,相机背面
我目前的方法是在拍摄照片使用前置摄像头,切换到后置摄像头,使用后置摄像头拍摄图片,将它们加载到两个UIImageView中,并执行图像视图的转换..(隐藏当前摄像机流程)。
问题是当我打电话从前置摄像头切换到后置摄像头时,cameraView(AVCapturePreviewLayer)会立即切换视图,然后我可以隐藏它(这发生在flipCamera中ToFront在最后一行.. [_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];
}
答
如果有人想知道,我想它了。我必须使用performSelectors来等待下一个运行循环,因为相机立即翻转,而视图的东西在运行循环之后等待......不确定具体情况,继承代码。
- (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];
}
工作很好!非常感谢 – user1181046 2013-08-29 23:16:47