iPhone:容器视图控制器和相机预览:子视图控制器中不显示预览

时间:2013-04-09 09:27:18

标签: ios uiviewcontroller camera avfoundation uistoryboard

我找到并阅读了此tutorial。确实非常好!我故意使用“读”这个词。如果我明白了,我现在不会在这里问。

现在:我试图将我读过的内容插入到我的应用程序中。我需要使用不同的叠加层来控制静止图像和相机预览。当应用程序的其余部分旋转时,我需要让相机预览静止不动。我需要它是AVFoundation,因为会有很多额外的图像和相机功能。我想旋转所有的应用程序但相机预览。自制的容器视图控制器是铰接点。在它之外,应用程序旋转。它控制其子项的旋转,我希望能够将手动旋转减少到所述容器视图控制器的相机预览子视图控制器的叠加层。

(除此之外:最重要的是我使用链接的故事板,ARC和CoreData(稍后的照片))

点是:我在容器视图控制器容器视图中有这个视图控制器。这是我想要预览的那个。我想在另一个容器视图控制器子视图控制器中使用静态图像,第三个子视图是fotos的浏览器。稍后将有按钮和手势从一个孩子导航到另一个孩子。捕获会话管理器是容器视图控制器的属性,即父级。

我已经设置了所有@properties(在捕获会话管理器,容器视图控制器和相机预览视图控制器中),以便在它们不存在时创建它们。我给了摄像头预览视图控制器一个属性,它是一个捕获会话管理器但是应该只是一个指向父会话管理器的指针(懒惰或致命错误?)。

据我所知,通过调试器步进,已建立连接。现在,在相机预览视图控制器的viewDidLoad方法中,我尝试显示预览图层。

然后我看到...... ......只是一个空白的白色视图:(

我有什么可以忘记的?

此时应该已经建立了父子连接。 embed segue设置了孩子的捕获管理器:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"EmbedCameraPreview"])
    { // present destination view
        if ([[segue destinationViewController] isKindOfClass:[CameraPreviewViewController class]]) {
            CameraPreviewViewController * destinationVC = (CameraPreviewViewController *)[segue destinationViewController];            
            [destinationVC setCaptureManager:[self captureManager]];
        }
        [self addChildView:[segue destinationViewController]];
    }
}

- (void) addChildView: (UIViewController*) content {
    [self addChildViewController:content];
    content.view.frame = [self maxFrame]; 
    [content didMoveToParentViewController:self];
}

- (CGRect) maxFrame {
    return [[[self view] layer] bounds];
}

孩子的捕获管理器是私有的(在.m文件中),带有公共setter:

接口:

@property (retain, nonatomic) CaptureSessionManager *captureManager;

实现:

@synthesize captureManager;

- (void)setCaptureManager:(CaptureSessionManager *) newCaptureManager {
    if (captureManager != newCaptureManager) {
        captureManager = newCaptureManager;
    }
}

- (CaptureSessionManager *) captureManager {
    if (captureManager != nil) {
        return captureManager;
    }

    if ([[self parentViewController] isKindOfClass:[CameraContainerViewController class]]) {
        CameraContainerViewController* parentView = (CameraContainerViewController*)[self parentViewController];        
        [self setCaptureManager:[parentView captureManager]];
    }

    return captureManager;
}
从父母的viewDidLoad内的content.view.frame = [self maxFrame]调用该孩子的

addChildView:见上文:prepareForSegue):

- (void) displayCameraPreview
{
    CGRect layerRect = [[[self view] layer] bounds];
    [[[self captureManager] previewLayer] setBounds:layerRect];
    [[[self captureManager] previewLayer] setPosition:CGPointMake(CGRectGetMidX(layerRect),
                                                                  CGRectGetMidY(layerRect))];
    [[[self view] layer] addSublayer:[[self captureManager] previewLayer]];
}

- (void) initDisplay {    
    [self displayCameraPreview];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    [self initDisplay];
}

请帮忙吗? :(

1 个答案:

答案 0 :(得分:2)

我非常抱歉!

再次感谢上述教程的作者。太棒了!

在将代码分开设置为不同的视图控制器时,我忽略了一个小细节。一个人应该开始会议,不应该一个?以下是可行的来源:

- (void) displayCameraPreview
{
    CGRect layerRect = [[[self view] layer] bounds];
    [[[self captureManager] previewLayer] setBounds:layerRect];
    [[[self captureManager] previewLayer] setPosition:CGPointMake(CGRectGetMidX(layerRect),
                                                                  CGRectGetMidY(layerRect))];
    [[[self view] layer] addSublayer:[[self captureManager] previewLayer]];

    [[captureManager captureSession] startRunning];
}