1

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

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

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

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

我已经设置了所有@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 文件中),具有公共设置器:

界面:

@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]内部调用子级(见上文: ):addChildViewprepareForSegue

- (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];
}

请帮忙?:(

4

1 回答 1

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];
}
于 2013-04-09T12:59:27.463 回答