【问题标题】:UIImagePickerController doesn't fill screenUIImagePickerController 没有填满屏幕
【发布时间】:2011-02-10 02:08:40
【问题描述】:

我正在向 UIImagePickerController 添加自定义叠加层,并且视图底部有一个持久的黑条。这是我实例化控制器的代码。

- (UIImagePickerController *)imagePicker {
    if (_imagePicker) {
        return _imagePicker;
    }

    _imagePicker = [[UIImagePickerController alloc] init];
    _imagePicker.delegate = self;

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        _imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

        _imagePicker.showsCameraControls = NO;

        _imagePicker.wantsFullScreenLayout = YES;
        _imagePicker.navigationBarHidden = YES;
        _imagePicker.toolbarHidden = YES;

    } else {
        _imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    }

    return _imagePicker;
}

当我不隐藏相机控件时,返回的控制器以模态方式显示并且工作正常(即显示全屏)。


多亏了 Ole 的建议,我才得以使用此代码:

// Resize the camera preview
        _imagePicker.cameraViewTransform = CGAffineTransformMakeScale(1.0, 1.03);

身高增加 3% 效果很好。当我在屏幕底部添加自定义工具栏时,窗口中不再有可见的黑条。

【问题讨论】:

    标签: iphone uiimagepickercontroller


    【解决方案1】:

    按固定值缩放不是一个好主意...因为我敢肯定,任何使用此处接受的答案的人都可能在 iPhone 5 推出时发现。

    这里有一个代码 sn-p 可以根据屏幕分辨率动态缩放以消除信箱。

    // Device's screen size (ignoring rotation intentionally):
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
    
    // iOS is going to calculate a size which constrains the 4:3 aspect ratio
    // to the screen size. We're basically mimicking that here to determine
    // what size the system will likely display the image at on screen.
    // NOTE: screenSize.width may seem odd in this calculation - but, remember,
    // the devices only take 4:3 images when they are oriented *sideways*.
    float cameraAspectRatio = 4.0 / 3.0;
    float imageWidth = floorf(screenSize.width * cameraAspectRatio);
    float scale = ceilf((screenSize.height / imageWidth) * 10.0) / 10.0;
    
    self.ipc.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
    

    【讨论】:

    • @Danpe 你能找到 iPhone 5 的解决方案吗?我有同样的问题 - 谢谢!
    • 它在 iPhone 5 设备上运行良好。但我面临另一个问题。拍完照片后,我试图在 UIImageView 中预览。与用户在相机中捕捉的图像相比,图像向右侧移动。有什么解决办法吗?
    • 以上使用后,大空间缩小为小空间。没有完全解决。
    • @steve,你能看一下这个适用于 iPhone 6/iPhone 6Plus 的内容吗,这还没有完全填满屏幕。一个简单的项目,在父视图控制器中加载图像选择器作为测试,复制和粘贴此代码将产生与我相同的结果。请回复我们,干杯。
    • 缩放不适用于我的 iOS 10 beta 7。有什么帮助或想法吗?
    【解决方案2】:

    相机的纵横比是 4:3,屏幕的纵横比是 3:2。因此,除非您愿意裁剪为 3:2,否则相机图片根本无法填满屏幕。为此,请应用适当的比例变换。

    【讨论】:

    • 就是这样。谢谢!我将使用使一切正常的代码来更新我的问题。
    • 是否有人对此有适用于所有设备的答案?使用上述因素进行缩放会扭曲图片,使用任何硬编码数字进行缩放仅适用于具有相同外形尺寸和坐标系的设备。有没有办法找到相机视图框架和边界并调整到窗口的边界?
    【解决方案3】:

    嘿,我看到有些人在计算 iPhone 5 的比例后仍然在底部出现黑条。我有一段时间遇到这个问题,但后来我发现你必须翻译视图,所以它在中间屏幕,然后应用比例。这是我做这两件事的代码,它对我有用!

        CGSize screenBounds = [UIScreen mainScreen].bounds.size;
    
        CGFloat cameraAspectRatio = 4.0f/3.0f;
    
        CGFloat camViewHeight = screenBounds.width * cameraAspectRatio;
        CGFloat scale = screenBounds.height / camViewHeight;
    
        m_imagePickerController.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenBounds.height - camViewHeight) / 2.0);
        m_imagePickerController.cameraViewTransform = CGAffineTransformScale(m_imagePickerController.cameraViewTransform, scale, scale);
    

    【讨论】:

    • 此解决方案在 iPhone 5 上运行良好。但是,正如 in this question 所报告的那样,CGAffineTransformTranslate 在旧 iOS 的 UIImagePickerController 中不起作用(不确定他们何时修复它)。此外,您似乎需要在史蒂夫的回答中使用 ceilf 舍入技巧,以便 CGAffineTransformScale 在较旧的 iOS 中工作。
    • 你说得对,我应该添加“运行 iOS 7 的 iPhone 5”。由于 CGAffineTransformScale 在较旧的 iOS 中无法正常工作,我一直在努力解决问题。
    • 工作得很好。节省了很多时间。
    • @strikerdude10 非常感谢哥们!
    • @EpicByte 你能确认它适用于 iPhone 6 和 6+ 吗?
    【解决方案4】:

    根据我在 iOS 7、iphone 5S 上的经验,要在全屏预览中看到图片的中心,您必须连接变换,而不是按顺序制作:

    pickerController.cameraOverlayView = self.view;
    
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;   // 320 x 568
    
    float scale = screenSize.height / screenSize.width*3/4;  // screen height divided by the pickerController height ... or:  568 / ( 320*4/3 )
    
    CGAffineTransform translate=CGAffineTransformMakeTranslation(0,(screenSize.height - screenSize.width*4/3)*0.5);
    CGAffineTransform fullScreen=CGAffineTransformMakeScale(scale, scale);
    pickerController.cameraViewTransform =CGAffineTransformConcat(fullScreen, translate);
    

    【讨论】:

    • 为什么翻译转换用户size.height - size.width?
    • 其实这是(screenSize.height - pickerController 的高度)*0.5 实际上screenSize.width * 4/3 等于pickerController 的高度
    【解决方案5】:

    用这个转换它:

    #define CAMERA_TRANSFORM                    1.12412
    
    _picker.wantsFullScreenLayout = YES;
    _picker.cameraViewTransform = CGAffineTransformScale(_picker.cameraViewTransform, CAMERA_TRANSFORM, CAMERA_TRANSFORM);
    

    【讨论】:

      【解决方案6】:

      这在 iOS 10 上对我有用:

      let screenSize = UIScreen.main.bounds.size
      let cameraAspectRatio = CGFloat(4.0 / 3.0)
      let cameraImageHeight = screenSize.width * cameraAspectRatio
      let scale = screenSize.height / cameraImageHeight
      imagePickerController.cameraViewTransform = CGAffineTransform(translationX: 0, y: (screenSize.height - cameraImageHeight)/2)
      imagePickerController.cameraViewTransform = imagePickerController.cameraViewTransform.scaledBy(x: scale, y: scale)
      

      【讨论】:

        【解决方案7】:

        这里是 Swift 的答案。

        let screenSize:CGSize = UIScreen.mainScreen().bounds.size
        
        let ratio:CGFloat = 4.0 / 3.0
        let cameraHeight:CGFloat = screenSize.width * ratio
        let scale:CGFloat = screenSize.height / cameraHeight
        
        let imag:UIImagePickerController = UIImagePickerController()
        imag.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenSize.height - cameraHeight) / 2.0)
        imag.cameraViewTransform = CGAffineTransformScale(imag.cameraViewTransform, scale, scale)
        

        【讨论】:

          【解决方案8】:

          我用这个方法来计算比例。

          // get the screen size
          CGSize screenSize = [[UIScreen mainScreen] bounds].size;
          // establish the height to width 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;
          imagePicker.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
          

          【讨论】:

            【解决方案9】:

            这些解决方案对我完全不起作用。在 iOS 13.x 下运行并使用 iPhone 6+ 和 iPhone 11 Pro 时,底部仍有一个黑条。通过计算中心偏移并将其应用于比例计算,我能够在不使用幻数的情况下解决这两个问题。这同样适用于 6+ 和 11 Pro。

                let screenSize = UIScreen.main.bounds.size
                let cameraAspectRatio = CGFloat(4.0 / 3.0)
                let cameraImageHeight = screenSize.width * cameraAspectRatio
                let offsetToCenter = screenSize.height - cameraImageHeight
                let scale = (screenSize.height + offsetToCenter) / cameraImageHeight
            
                if UIImagePickerController.isSourceTypeAvailable(.camera) {
                    myPickerController.delegate = self
                    myPickerController.sourceType = .camera
                    myPickerController.showsCameraControls = false
                    myPickerController.allowsEditing = false
                    myPickerController.cameraViewTransform = CGAffineTransform(scaleX: scale, y: scale)
                    myPickerController.cameraOverlayView = CameraOverlay(frame: vc.view.frame, delegate: self)
                    currentVC.present(myPickerController, animated: true)
                }
            }
            

            【讨论】:

            • 这是这里唯一有效的答案 ;)
            【解决方案10】:

            我的问题解决了 :)

            //Camera is 426 * 320. Screen height is 568.  Multiply by 1.333 in 5 inch (iPhone5) to fill vertical
            
            CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 71.0); //This slots the preview exactly in the middle of the screen by moving it down 71 points
            self.imagePickerController.cameraViewTransform = translate;
            
            CGAffineTransform scale = CGAffineTransformScale(translate, 1.333333, 1.333333);
            self.imagePickerController.cameraViewTransform = scale;
            

            【讨论】:

            • 不适用于 IOS 10
            • @vualoaithu 你有什么解决办法吗?因为我面临同样的问题。
            【解决方案11】:

            斯威夫特 5

            100% 工作 简单的解决方案 如果您想在某些自定义 UIView 中显示相机,请使用该代码,相机将全屏显示

            class ViewController: UIViewController, UINavigationControllerDelegate,UIImagePickerControllerDelegate {
            
            
            }
            

            上半部分是委托,下半部分是函数

            //Mark:- Call this function and enjoy
            var imagePickers:UIImagePickerController?
            func addCameraInView(){
                imagePickers = UIImagePickerController()
                if UIImagePickerController.isCameraDeviceAvailable( UIImagePickerController.CameraDevice.rear) {
                    imagePickers?.delegate = self
                    imagePickers?.sourceType = UIImagePickerController.SourceType.camera
                    //imagePickers?.view.frame = customCameraView.bounds
                    imagePickers?.view.contentMode = .scaleAspectFit
                    imagePickers?.allowsEditing = false
                    imagePickers?.showsCameraControls = false
                    imagePickers?.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            
                   //Mark:- this part is handling camera in full screen in a custom view
                   // let screenSize = UIScreen.main.bounds.size
                    let screenSize = customCameraView.bounds.size
                    let cameraAspectRatio = CGFloat(4.0 / 4.0)
                    let cameraImageHeight = screenSize.width * cameraAspectRatio
                    let scale = screenSize.height / cameraImageHeight
                    imagePickers?.cameraViewTransform = CGAffineTransform(translationX: 0, y: (screenSize.height - cameraImageHeight)/2)
                    imagePickers?.cameraViewTransform = (imagePickers?.cameraViewTransform.scaledBy(x: scale, y: scale))!
            
                    // Add the child's View as a subview
                    self.customCameraView.addSubview((imagePickers?.view)!)
                }
            }
            

            如果您想从主屏幕显示,则需要更改比率 (4.0/3.0)

               let screenSize = UIScreen.main.bounds.size
               let cameraAspectRatio = CGFloat(4.0 / 3.0)
            

            【讨论】:

              【解决方案12】:

              这对我来说是 Swift 4

              let screenSize: CGSize = picker.view.safeAreaLayoutGuide.layoutFrame.size
              let ratio: CGFloat = 4.0 / 3.0
              let cameraHeight: CGFloat = screenSize.width * ratio
              let scale: CGFloat = (screenSize.height + 80) / cameraHeight
              picker.cameraViewTransform = picker.cameraViewTransform.scaledBy(x: scale, y: scale)
              

              【讨论】:

                【解决方案13】:

                尝试使用此代码:

                picker.wantsFullScreenLayout = YES;
                CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 71.0);
                CGAffineTransform scale = CGAffineTransformScale(translate, 1.333333, 1.47);
                picker.view.transform = scale;
                

                【讨论】:

                  【解决方案14】:
                  PickerViewController.m    
                  #define CAMERA_TRANSFORM  1.8
                  
                  - (void)viewDidAppear:(BOOL)animated
                  {
                   if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
                      {
                         // type = UIImagePickerControllerSourceTypeCamera;
                  
                          UIImagePickerController *picker = [[UIImagePickerController alloc] init];
                          picker.allowsEditing = NO;
                          picker.delegate   = self;
                          picker.sourceType = UIImagePickerControllerSourceTypeCamera;
                          picker.showsCameraControls=NO;
                          picker.extendedLayoutIncludesOpaqueBars = YES;
                          picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform, CAMERA_TRANSFORM , CAMERA_TRANSFORM);
                  
                          [self presentViewController:picker animated:YES completion:nil];
                      }else{
                  
                          UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message"
                                                                          message:@"Device have no camera"
                                                                         delegate:self
                                                                cancelButtonTitle:@"OK"
                                                                otherButtonTitles:nil];
                          [alert show];
                      }
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多