【问题标题】:iPhone: Container View Controller and Camera Preview: preview is not displayed in child view controlleriPhone:容器视图控制器和相机预览:子视图控制器中不显示预览
【发布时间】:2013-04-09 09:27:18
【问题描述】:

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

现在:我尝试将我读到的内容插入到我的应用程序中。我需要带有静态图像和相机预览控件的不同叠加层。我需要相机预览在应用程序的其余部分旋转时静止不动。我需要它是 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 被父级的addChildView 内部的content.view.frame = [self maxFrame] 调用(见上图: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];
}

请帮忙? :(

【问题讨论】:

    标签: ios uiviewcontroller camera avfoundation uistoryboard


    【解决方案1】:

    非常抱歉!

    再次感谢上述教程的作者。干得好!

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多