【问题标题】:configuring frame size of UIImagePickerController配置 UIImagePickerController 的帧大小
【发布时间】:2012-04-15 17:59:03
【问题描述】:

是否可以更改 UIImagePickerController 的可显示帧大小?我想显示相机视图,但不是在整个屏幕上,而是在 100x100 的边界框中。

这是我的 viewDidAppear:

- (void) viewDidAppear:(BOOL)animated {

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.showsCameraControls = NO;
picker.cameraDevice = UIImagePickerControllerCameraDeviceFront;
picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform, CAMERA_TRANSFORM_X, CAMERA_TRANSFORM_Y);

[self presentModalViewController:picker animated:YES];  

[super viewDidAppear:YES];
 }

我在任何地方都找不到这样做的方法...没有人使用它吗?

【问题讨论】:

  • 你的问题解决了吗?

标签: iphone objective-c ios xcode camera


【解决方案1】:

我对上一篇文章中的代码进行了实验,并注释掉了最终的比例变换((使其成为全尺寸的那个),最后我得到了一个可爱的微型相机 imagePicker 漂浮在我的屏幕中间,所以它绝对有效!我使用的确切代码(包括缩放/淡入过渡)是 -

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

imagePickerController.delegate = self;
imagePickerController.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeImage, nil];
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;

UIView *controllerView = imagePickerController.view;

controllerView.alpha = 0.0;
controllerView.transform = CGAffineTransformMakeScale(0.5, 0.5);

[[[[UIApplication sharedApplication] delegate] window] addSubview:controllerView];

[UIView animateWithDuration:0.3
                  delay:0.0
                options:UIViewAnimationOptionCurveLinear
             animations:^{
                 controllerView.alpha = 1.0;
             }
             completion:nil
 ];

[imagePickerController release];

我相信您可以对其进行更多自定义,更改相机视图的大小和位置。

【讨论】:

  • 您的代码运行良好。但是覆盖屏幕的下边距大于上边距,因此它并不完全位于屏幕的中心。有什么解决办法吗?
  • 只需改变controllerView在动画中的最终位置:block
【解决方案2】:

如果您想在 UIImagePickerController 顶部显示叠加层,例如在我的情况下,同时在叠加层上的某些 UI 组件(例如顶栏和底栏),请使用以下代码。这是基于上面 SomaMan 的回答(谢谢),主要区别是将 UIImagePickerController 的视图显示为当前控制器的子视图,而不是作为主应用程序窗口的子视图。把这段代码放到viewDidLoad()中:

// Overlay view with custom camera controls and a top bar and a bottom bar
self.overlay = [[CameraOverlayView alloc] initWithFrame:self.view.bounds];
[self setOverlayViewModel];

self.imagePicker = [[UIImagePickerController alloc] init];
self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
self.imagePicker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
self.imagePicker.showsCameraControls = NO;
self.imagePicker.navigationBarHidden = YES;
self.imagePicker.toolbarHidden = YES;
self.imagePicker.delegate = self;

UIView *imagePickerView = self.imagePicker.view;

if ([[UIScreen mainScreen] bounds].size.height == 568.0f) {
    // iPhone 5, 16:9 ratio, need to "zoom in" in order to fill the screen since there is extra space between top and bottom bars on a taller screen
    self.imagePicker.cameraViewTransform = CGAffineTransformScale(self.imagePicker.cameraViewTransform, 1.5, 1.5); // change 1.5 to suit your needs
}
CGRect cameraViewFrame = CGRectMake(0, self.overlay.topBarHeight, 
                                    self.view.bounds.size.width, 
                                    self.view.bounds.size.height - self.overlay.topBarHeight - self.overlay.bottomBarHeight);
imagePickerView.frame = cameraViewFrame;

// keep this order so that the overlay view is on top of the "live camera feed" view
[self.view addSubview:imagePickerView];
[self.view addSubview:self.overlay];

提示:在执行 cameraViewTransform 时,如果您希望用户最终获得与他们通过转换后的选择器视图看到的图像相同的图像,请确保在选择器为您捕获的结果照片上应用相同的转换:P

【讨论】:

  • @Alex - 如何在 uiimage 上设置变换?
  • @kshitijgodara 嗨,对不起,我刚刚注意到这一点,但由于 UIImagePickerController 的限制,我基本上放弃了使用它。使用 AV 框架一点也不难,不久前我写了一篇博文,将其作为其他内容的一部分:radioactiveukrainian.com/2014/01/06/…
【解决方案3】:

我有时会直接添加 ImagePicker 的视图,虽然我从未尝试过更改其最终大小,但它确实“缩放”到屏幕中,这表明它可能以不同的大小显示(代码直接提升来自我的一个项目,所以可能不是所有相关的)-

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

imagePickerController.delegate = self;
imagePickerController.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeImage, nil];
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;

UIView *controllerView = imagePickerController.view;

controllerView.alpha = 0.0;
controllerView.transform = CGAffineTransformMakeScale(0.5, 0.5);

[[[[UIApplication sharedApplication] delegate] window] addSubview:controllerView];

[UIView animateWithDuration:0.3
                      delay:0.0
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     controllerView.transform = CGAffineTransformMakeScale(1.0, 1.0);
                     controllerView.alpha = 1.0;
                 }
                 completion:nil
 ];

[imagePickerController release];

有兴趣看看你是否得到任何结果。

【讨论】:

  • 不,没用,抱歉...我很惊讶这么简单的东西在任何地方都找不到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2019-12-14
相关资源
最近更新 更多