2013-03-10 43 views
4

我使用AVFoundation創建視頻相機UI。包含的視圖控制器只能以LandscapeRight方向顯示。當改變通過預覽層的輸出方向,它會顯示正確:改變AVCaptureVideoPreviewLayer方向的問題

self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession]; 
self.previewLayer.orientation = AVCaptureVideoOrientationLandscapeRight; 
[self.displayContainer.layer addSublayer:self.previewLayer]; 

不過,我意識到AVCaptureVideoPreviewLayer的方向屬性,而AVCaptureConnection.videoOrientation被棄用。改爲使用時:

self.previewLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight; 

即使嘗試不同方向的選項,預覽圖層也不會改變方向。我錯過了另一個步驟,以推薦的方式做到這一點?

編輯:

下面是出現在視圖控制器自動旋轉方法:

-(BOOL)shouldAutorotate 
{ 
    return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscapeRight; 
} 

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationLandscapeRight; 
} 

SOLUTION:

這是解決雙方通過應用所有建議的@ Spectravideo328的答案,通過將預覽圖層添加到ViewControllers視圖圖層,而不是displayContainer子視圖。

+0

請在下面看到更新的答案。 – Spectravideo328 2013-03-10 21:19:43

回答

1

您的問題不是AvCaptureVideoPreviewLayer問題,而是一般CALayer問題(其中的previewLayer是其子類)。

所有CALayers需要他們的幀設置:在你的情況,我只想添加到您的代碼:

self.previewlayer.frame=self.view.bounds. 

您使用self.view.bounds而不是self.view.frame使這是關鍵如果設備旋轉,則預覽層尺寸將旋轉(調整)。

希望這會有所幫助。

更新: 這是從supportedInterfaceOrientations幫助說明:

當用戶改變設備方向時,系統調用根視圖控制器或填充窗口的最上面的呈現視圖控制器上此方法。如果視圖控制器支持新的方向,則窗口和視圖控制器將旋轉到新的方向。只有在視圖控制器的shouldAutorotate方法返回YES時才調用此方法。

更新您的shouldAutorotate以始終返回YES。

+0

感謝您提供關於邊界與幀的註釋,我沒有意識到這種區別。但是,這不能解決問題。無論我使用什麼方向值,預覽圖層都保持不變。 – Chris 2013-03-10 17:36:07

+0

@Chris,我認爲還有其他一些地方可能會出現問題。讓我們從這個開始吧:你的VC中是否有shouldAutorotateToInterfaceOrientation讓VC知道接受哪些方向? – Spectravideo328 2013-03-10 19:36:33

+0

剛剛更新了原來的問題。 – Chris 2013-03-10 20:58:56