为iOS 8动态设置cameraViewTransform

时间:2015-10-06 05:02:36

标签: ios objective-c ios8 uiimagepickercontroller

我正在制作相机应用程序,我应该在enter image description here

中显示相机

我正在使用camView.cameraViewTransform = CGAffineTransformMakeScale(1.0, 1.0) ;但不同设备会得到不同的结果,标签栏和相机之间会出现黑条。如果我更改scaling的值,则相机太大了。对此事的任何帮助都将非常感激。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self prepareCamera];
}

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:NO];
    [self launchCamera];
}

- (void)prepareCamera{
    camView = [[UIImagePickerController alloc] init];
    camView.delegate = self;
    camView.sourceType = UIImagePickerControllerSourceTypeCamera;
    camView.showsCameraControls = NO;
    [self resizeCameraView];
}


- (void)resizeCameraView{
    CGSize screenSize = self.view.bounds.size;
    // set the aspect ratio of the camera
    float heightRatio = 4.0f / 3.0f;
    // calculate the height of the camera based on the screen width
    float cameraHeight = screenSize.width * heightRatio;
    // calculate the ratio that the camera height needs to be scaled by
    float scale = screenSize.height / cameraHeight;
    // move the controller to the center of the screen
    camView.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenSize.height - cameraHeight) / 2.0);
    // concatenate the scale transform
    camView.cameraViewTransform = CGAffineTransformScale(camView.cameraViewTransform, scale, scale);
}

- (void)launchCamera{
        [camSubView addSubview:camView.view];
        [camView viewWillAppear:YES];
        [camView viewDidAppear:YES];
}

2 个答案:

答案 0 :(得分:3)

Apple正式支持您正在努力实现的目标。来自UIImagePickerController Class Reference

  

要使用包含其默认控件的图像选择器控制器,请执行以下步骤:

     

...

     
      
  1. 显示用户界面。 在iPhone或iPod touch上,通过调用当前活动视图控制器的presentViewController:animated:completion: 方法以模态方式(全屏)执行此操作,将已配置的图像选择器控制器作为新视图控制器传递。 / p>      

    在iPad上,如果指定源类型为UIImagePickerControllerSourceTypeCamera,则可以使用模式(全屏)或使用弹出窗口显示图像选择器。但是,Apple建议您仅以全屏方式显示相机界面

  2.   

您可以做的是以模态方式(全屏)呈现UIImagePickerController并添加具有cameraOverlayView属性的自定义控件。

<强>解决方案

要实现您想要的功能,您必须使用AVFoundation而不是UIImagePickerController。 AV Foundation库提供了一种更强大的拍照方式,可让您将相机视图放入自己的应用程序中。您可以找到一个好的教程here,或者更新的here

答案 1 :(得分:1)

问题是你想在结果中得到什么。 CGAffineTransformMakeScale(1.0,1.0)是默认比例 - 所以这不做任何更改。 所有苹果设备上的相机都具有4:3的宽高比。另外,我必须承认默认的摄像机视图的大小与屏幕宽度相等,高度可以促成4:3的升级 - 这就是为什么你总是有不同的摄像机视图。

如果你想要高度等于屏幕高度的摄像机视图,你需要做一些仿射变换。这是一个例子:

CGFloat cameraAspectRation = 4.0/3.0;
CGFloat cameraViewStarterHeight = screenSize.width*cameraAspectRation;
CGFloat cameraAdjustedYPosition = (screenSize.height - cameraViewStarterHeight)/2 - 20;
CGFloat cameraScaleTransformCoef = screenSize.height/cameraViewStarterHeight;

CGAffineTransform adjustedYPositionTransform = CGAffineTransformMakeTranslation(0, cameraAdjustedYPosition);
CGAffineTransform adjustedScaleTransform = CGAffineTransformMakeScale(cameraScaleTransformCoef, cameraScaleTransformCoef);

self.cameraViewTransform = CGAffineTransformConcat(adjustedYPositionTransform, adjustedScaleTransform);

但是通过这种方式,正如您所看到的那样,摄像机视图将被缩放&#34;。 希望这能帮助您了解您遇到的问题。