2011-07-23 24 views
4

我已經開始使用UIImagePickerController捕獲靜止圖像的項目。由於疊加層和剛拍攝的圖像之間的互動不良,我放棄了使用這種簡單的機制。問題如下:如果您的疊加層處於活動狀態,並且拍攝照片,則當用戶出現使用或重新拍攝圖像的選項時,剛拍攝的圖像會旋轉以填充縱向方向。發生這種情況時,無法關閉疊加層,或者旋轉疊加層以對應於新的靜態圖像預覽方向。不好。使用AV基金會時旋轉AV視頻預覽區域和其他元素

我決定嘗試使用AV Foundation的各種機制來重新實現UIImagePickerController的靜態圖像捕獲行爲。這已經非常容易設置,但我仍然有一些揮之不去的問題:

1)我想重新定位機制類似於UI在標準UIImagePickerController中的工作方式。在此控制器中,如您所知,無論手機如何旋轉,按鈕欄始終保持固定在縱向方向的底部。在這個按鈕欄中,按鈕中的字形本身會旋轉,但其他一切都保持不變。重疊控制,閃光燈設置,相機切換和選項將重新定向。如何讓這個標籤欄在旋轉這些其他元素時保持固定?有沒有辦法從旋轉中排除某些元素?

2)在進行自動重新定向時,我希望AVVideoCaptureLayer始終保持活動並佔據整個屏幕。當設備執行重新定向旋轉時,該圖層變得奇怪(縮小),視頻輸入本身偏離90度。顯然,此圖層正在旋轉,但不是全屏尺寸,並且視頻Feed本身的行爲並不像預期的那樣。我希望視頻保持固定,並在整個旋轉過程中佔據整個屏幕,並且始終處於啓用狀態,並且在旋轉過程中不會調整預覽大小。但我也希望能夠像第1項那樣做,並且要調整某些元素。

任何示例代碼說明如何實現這一點非常感謝。

回答

2

我在自己的努力中遇到了類似的問題,最後放棄了試圖影響視頻流的想法。相反,我專注於AVCaptureVideoPreviewLayer本身以及與此解決方案提出了:

- (void)orientationChangedMethod { 
    self.previewLayer.orientation = [[UIDevice currentDevice] orientation]; 
    self.previewLayer.frame = self.view.bounds; 
} 

哪裏orientationChangedMethod是the.ichibod.com到(非常有用)的代碼填充和self.previewLayer是我AVCaptureVideoPreviewLayer實例的引用。

此答案自iOS 6起棄用!

+0

謝謝。很棒的解決我只是剔除了一堆轉換和框架大小調整。你的解決方案要簡單得多。做得好。 – CocoaEv

+0

剛剛發現在AVCaptureVideoPreviewLayer上使用orientation屬性已被棄用。我使用更新後的解決方案更新了以下答案。再次感謝@Jaret Ward! – CocoaEv

+3

**這個答案在iOS 6 **中不推薦使用。 – sabalaba

6

剛發現在AVCaptureVideoPreviewLayer上使用orientation屬性已被棄用。這裏是一個更新的解決方案(儘管以前的解決方案由@Jaret Ward共享的工作要少得多:):

使用推薦的方法在AVCaptureConnection中使用setVideoOrientation進行更改。我會在viewDidAppear中添加對此的調用,並在您的一個循環回調中添加一個調用。

//setup a connection to the preview layer 
AVCaptureConnection *connection; 
connection = [self.videoPreviewLayer connection]; 
[connection setVideoOrientation:[self avOrientationForDeviceOrientation:[[UIDevice currentDevice] orientation]]]; 

//translate the orientation 
- (AVCaptureVideoOrientation)avOrientationForDeviceOrientation:(UIDeviceOrientation)deviceOrientation { 

AVCaptureVideoOrientation result = deviceOrientation; 
if (deviceOrientation == UIDeviceOrientationLandscapeLeft) 
    result = AVCaptureVideoOrientationLandscapeRight; 
else if (deviceOrientation == UIDeviceOrientationLandscapeRight) 
    result = AVCaptureVideoOrientationLandscapeLeft; 
else if(deviceOrientation == UIDeviceOrientationPortrait) 
    result = AVCaptureVideoOrientationPortrait; 
else if(deviceOrientation == UIDeviceOrientationPortraitUpsideDown) 
    result = AVCaptureVideoOrientationPortraitUpsideDown; 
return result; 
} 
3

通過設置視頻預覽圖層連接的方向屬性。

這只是@ CocoaEv答案的一個更清晰的版本。它除了使定向修復成爲一個功能而不是一種方法外,還使用更新的點語法。

self.videoPreviewLayer.connection.videoOrientation = AVOrientationFromDeviceOrientation([UIDevice currentDevice].orientation); 

AVCaptureVideoOrientation AVOrientationFromDeviceOrientation(UIDeviceOrientation deviceOrientation) { 
    if (deviceOrientation == UIDeviceOrientationLandscapeLeft) 
     return AVCaptureVideoOrientationLandscapeRight; 
    else if (deviceOrientation == UIDeviceOrientationLandscapeRight) 
     return AVCaptureVideoOrientationLandscapeLeft; 
    else if(deviceOrientation == UIDeviceOrientationPortrait) 
     return AVCaptureVideoOrientationPortrait; 
    else if(deviceOrientation == UIDeviceOrientationPortraitUpsideDown) 
     return AVCaptureVideoOrientationPortraitUpsideDown; 
    else 
     return deviceOrientation; 
} 
相關問題