2013-04-09 72 views
1

我已经找到并阅读了这个tutorial。确实非常好!我故意使用“读”一词。如果我明白了,我现在就不会在这里问了。iPhone:容器视图控制器和相机预览:预览不显示在子视图控制器中

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

(旁白:在这一切之上,我使用链接的故事板,ARC和CoreData(后来的照片))

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

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

据我所知,通过调试程序进行连接已经完成。现在,在相机预览视图控制器的viewDidLoad方法中,我尝试显示预览图层。

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

还有什么我忘了?

此时父子连接应该已经作出。该嵌入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; 
} 

孩子的viewDidLoadcontent.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]; 
} 

帮助,好吗? :(

回答

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]; 
} 
相关问题