2013-04-09 69 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]; 
} 
相關問題