2010-08-04 19 views
6

我將iPhone和SDK升級到了iOS 4.0.1,現在我的應用程序的運行方式與在iOS 3.x中運行的方式不同。UIImagePickerController cameraViewTransform在iOS 4中的行爲有所不同

我的應用程序使用UIImagePickerController與自定義cameraOverlayView(我會壓制在這篇文章中)。重點是我需要以全屏模式查看iphone相機。爲了直接解決問題,我將提供一些代碼和屏幕截圖來解釋發生了什麼。

我使用名爲「CameraTransform」的XCode模板項目創建了一個基於視圖的應用程序,所以我得到了兩個類:CameraTransformAppDelegateCameraTransformViewController,好的!在CameraTransformViewControllerviewDidAppear方法我把下面的代碼:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    UIImagePickerController* picker = [[UIImagePickerController alloc] init]; 

    picker.sourceType = UIImagePickerControllerSourceTypeCamera;   
    picker.delegate = self; 

    //[self configurePicker_FirstAttempt:picker]; Use this! 
    //[self configurePicker_SecondAttempt:picker]; Use this too! 

    [self presentModalViewController:picker animated:YES]; 
} 

- (void)configurePicker_FirstAttempt:(UIImagePickerController*) picker { 
    picker.showsCameraControls = NO; 
    picker.navigationBarHidden = YES; 

    // not needed (use defaults) 
    //picker.toolbarHidden = YES; 
    //picker.wantsFullScreenLayout = YES; 
} 

- (void)configurePicker_SecondAttempt:(UIImagePickerController*) picker { 

    // Transform values for full screen support 
    CGFloat cameraTransformX = 1.0; 
    CGFloat cameraTransformY = 1.12412; 

    picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform, cameraTransformX, cameraTransformY); 
} 

與運行項目/我得到:

注:

  1. 使用iOS 3.x的我所使用的第三種方法(兩種方法未註釋的)來配置機械手,這是顯示在沒有「黑條」全屏模式在底部。
  2. 我檢查了picker.cameraViewTransform原始值(縮放之前)並將其設置爲Identity(如預期的那樣)。
  3. picker.view.frame設置爲屏幕邊界的(0.0,0.0,320.0,480.0)
  4. 我試圖串連翻譯到picker.cameraViewTransform(被縮放後),就像這樣:CGAffineTransformTranslate(picker.cameraViewTransform, 0.0, 20.0);,我意識到,有一些部分隱藏的「相機視圖」(也許它的原點不是0.0,0.0),所以我在屏幕上獲得了更多的「相機視圖」。

它看起來像在新的SDK UIImagePickerController已經改變了某種方式,也許相機控制有不同的大小os的東西。

有沒有人有這個問題?

+0

我也有同樣的問題,並感謝與縮放技巧。我嘗試翻譯,但似乎沒有受到它的影響。這裏發生的事情真的很奇怪。 我現在堅持縮放。如果有人對此問題有適當的答案,我們肯定會感激。 – Buju 2010-08-12 17:01:46

回答

14

IOS 4.0幻數三百二十○分之一千九百三十六= 6.05,2592/6.05 = 428,480-428 = 52 52 /(2分之428)= 0.24299 + 1 = 1.24299

IOS 3.0幻數1536/320 = 4.8 2048/4.8 = 427 480-427 = 53 53/427 = 0.121412 + 1 = 1.12412

即的關係cameraresolution-的屏幕分辨率

對於iOS 3.0從頂部施加的cameraViewTransform所以你必須使用所有的高度。但在iOS4中,它是從框架的中心應用的,因此您必須使用高度的一半。而且你必須向下移動框架(52/2)以將框架留在中心。

+0

嗨伊拉,你有任何想法的iPad相機只在橫向模式? – iBhavik 2013-02-28 05:28:25

2

我發現iPhone 4的新比例變換爲〜1.25(而不是〜1.12)。

我花了幾分鐘的時間試圖弄清楚這些神奇的數字來自哪裏 - 我認爲在屏幕分辨率&的相機分辨率之間存在着某種關係,但我無法匆匆計算出來......

如果有人這樣做,請發表一個答案 - 我討厭魔法數字。

僅供參考iPhone 4的相機分辨率是2592x1936,而iPhone 3GS是2048x1536。

4

我不確定關於iOS 3.0,但iOS 4.0中,cameraViewTransform是從幀的中心應用的。您可以通過首先應用轉換轉換來驗證此情況。

CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 27.0); 
imagePickerController.cameraViewTransform = translate; 

您可以看到,這將視圖移動到中心。接下來應用縮放轉換,您將看到它填滿了屏幕。

CGAffineTransform scale = CGAffineTransformScale(translate, 1.125, 1.125); 
imagePickerController.cameraViewTransform = scale; 

如果縮放變換本身適用於iOS 3和公司,那麼變換將應用於不同的錨點,如中心頂部。您應始終在兩個方向上進行線性縮放,否則圖像會發生傾斜。

3

CGAffineTransformMakeTranslation不能直接在cameraViewTransform上工作。因此,使用CGAffineTransformScale來應用CGAffineTransformMakeTranslation。

float yOffset = 44.0; 
CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, yOffset); 
self.cameraFeed.cameraViewTransform = CGAffineTransformScale(translate, 1, 1); 
相關問題