2014-07-25 53 views
1

我目前正在開發一個應用程序來記錄和編輯視頻。洞應用程序只支持橫向模式 - 所以我想使用橫向相機控件。但預覽屏幕總是切換回肖像。有一個類似的問題之前被問到(camera preview is portrait in landscape app),但遺憾的是沒有任何可接受的答案。UIImagePickerController - 將視頻預覽變爲風景

我試了幾種方法:

首先我手動添加的UIImagePickerController的觀點 - 預覽正是因爲我希望它是,但視頻圖像(同時記錄)是錯誤的(側身)。

代碼:

- (BOOL) startCameraController { 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO) { 
     return NO; 
    } 

    self.cameraUI = [[UIImagePickerController alloc] init]; 
    self.cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; 
    self.cameraUI.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil]; 
    self.cameraUI.allowsEditing = NO; 
    self.cameraUI.delegate = self.parentViewController; 

    [self.parentViewController addChildViewController:self.cameraUI]; 
    self.cameraUI.view.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
    [self.parentViewController.view addSubview:self.cameraUI.view]; 

    return YES; 
} 

結果:

The preview is displayed in the correct orientation, but the camera image is turned sideways.

然後我用presentViewController展現UIImagePickerController - 相機記錄工作完全正常,但預覽屏幕處於縱向和我有讓我的設備可以使用它。

代碼:

- (BOOL) startCameraController { 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO) { 
     return NO; 
    } 

    self.cameraUI = [[UIImagePickerController alloc] init]; 
    self.cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; 
    self.cameraUI.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil]; 
    self.cameraUI.allowsEditing = NO; 
    self.cameraUI.delegate = self.parentViewController; 

    [self.parentViewController presentViewController:self.cameraUI animated:YES completion:^{}]; 

    return YES; 
} 

結果:

The preview screen is turned upside down, so that I have to turn my device to use the controls.

我甚至listend到事件_UIImagePickerControllerUserDidCaptureItem到當相機改變爲預覽並試圖手動轉動視圖檢測 - 但是我沒無法調整預覽視圖的框架尺寸。

代碼:

- (void) cameraChangedToPreview { 
    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO]; 

    if ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationLandscapeRight) { 
     self.cameraUI.view.transform = CGAffineTransformMakeRotation(M_PI_2); 
    } else if ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationLandscapeLeft) { 
     self.cameraUI.view.transform = CGAffineTransformMakeRotation(-M_PI_2); 
    } 

    if (IS_WIDESCREEN) { 
     self.cameraUI.view.frame = CGRectMake(0, 0, 568, 320); 
    } else { 
     self.cameraUI.view.frame = CGRectMake(0, 0, 480, 320); 
    } 
} 

結果: The screen dimensions of the preview are wrong.

我將是任何提示或建議,我怎麼能在橫向模式下使用相機和預覽非常感激,這樣我可以用我的洞應用而不需要在此過程中轉動設備(該設備在使用應用程序時將處於三腳架中,因此無法轉動。)

謝謝並祝願您!

回答

0

UIImage的選擇器視圖不僅可以在橫向模式在這裏使用的是蘋果公司說,它

mportant:UIImagePickerController類只支持肖像模式。此類旨在按原樣使用,不支持子類。這個類的視圖層次是私有的,不能修改,只有一個例外。您可以將自定義視圖分配給cameraOverlayView屬性,並使用該視圖呈現附加信息或管理攝像頭界面和代碼之間的交互。

你可以閱讀更多關於它從這裏 https://developer.apple.com/library/ios/documentation/uikit/reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html#//apple_ref/doc/uid/TP40007070-CH3-DontLinkElementID_1

0

可以顯示視圖控制器模式,鎖定旋轉爲縱向,然後聽運動傳感器,並從那裏進行旋轉檢測。事情是這樣的:

self.motionManager = [[CMMotionManager alloc] init]; 
self.motionManager.accelerometerUpdateInterval = 0.5f; 
[self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] 
             withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { 
              float x = -accelerometerData.acceleration.x; 
              float y = accelerometerData.acceleration.y; 
              float angle = atan2(y, x); 

              if(angle >= -2.25 && angle <= -0.75) { 
               currentOrientation = UIInterfaceOrientationPortrait; 
              } else if(angle >= -0.75 && angle <= 0.75){ 
               currentOrientation = UIInterfaceOrientationLandscapeRight; 
              } else if(angle >= 0.75 && angle <= 2.25) { 
               currentOrientation = UIInterfaceOrientationPortraitUpsideDown; 
              } else if(angle <= -2.25 || angle >= 2.25) { 
               currentOrientation = UIInterfaceOrientationLandscapeLeft; 
              } 
             }]; 

之後,您可以使用currentOrientation與保存之前正確旋轉圖像:

[videoConnection setVideoOrientation:currentOrientation]; 

希望這有助於你