【问题标题】:UIPickerController leaves black bottom barUIPickerController 留下黑色底栏
【发布时间】:2016-01-04 13:59:37
【问题描述】:

我正在使用以下代码来显示 UIPickerController 及其覆盖视图:

-(void) viewDidLoad{
    self.overlayView = [[OverlayViewController alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.overlayView.delegate = self;
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        imagePickerController = [[UIImagePickerController alloc] init];
        imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
        imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;
        imagePickerController.cameraOverlayView.frame=self.view.frame;
        imagePickerController.showsCameraControls = NO;
        imagePickerController.navigationBarHidden = YES;
        imagePickerController.toolbarHidden = YES;
    //imagePickerController.cameraViewTransform = CGAffineTransformScale(imagePickerController.cameraViewTransform, 1.0, 1.3);
        imagePickerController.delegate = self.overlayView;
        // as a delegate we will be notified when pictures are taken and when to dismiss the image picker

        [self.view addSubview:imagePickerController.view];
        imagePickerController.cameraOverlayView =self.overlayView.view;
    } else {
        [self.view addSubview:self.overlayView.view];

    }
 }

然而,当 iPhone 保持纵向时,屏幕底部会显示一个黑条。正如您在附加的屏幕截图中看到的那样,没有横栏出现。如何解决?

【问题讨论】:

  • 似乎overlayView是通过程序创建的,您需要调整overlayView的Mode(Scale to Fill、Aspect Fit等)或调整相机视图的大小。在您的纵向屏幕截图中,相机视图适合主视图并且您会看到黑条,因为相机 (4:3) 和 iPhone 屏幕 (16:9) 的纵横比不同。在您的横向屏幕截图中,相机视图似乎被缩放以填充屏幕,但图像在顶部和底部被裁剪。
  • 那我应该怎么做呢?我不能依靠未来设备的最终尺寸来正确地冻结屏幕……难道没有办法只填满屏幕吗?
  • overlayView 的 A 坦率地说,除了以编程方式创建它之外,我没有其他方法可以创建它。甚至 UIImagePicker 控制器都没有对应的 Storyboard,它的 overlayView 怎么说?!

标签: ios iphone uiimagepickercontroller


【解决方案1】:

我认为这个问题:How to get the custom overlay for UIImagePicker camera to be full screen in iOS 7? 是同一个问题,你可以在那里找到答案。

【讨论】:

    【解决方案2】:

    在情节提要中插入 viewController 后,我按照线程中的建议实现了它:

    -(void) viewDidLoad{
         self.overlayView = [[OverlayViewController alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
         self.overlayView.delegate = self;
         if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
         {
             imagePickerController = [[UIImagePickerController alloc] init];
             imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
             imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;
             imagePickerController.cameraOverlayView.frame=self.view.frame;
             imagePickerController.showsCameraControls = NO;
             imagePickerController.navigationBarHidden = YES;
             imagePickerController.toolbarHidden = YES;
    
             //imagePickerController.cameraViewTransform = CGAffineTransformScale(imagePickerController.cameraViewTransform, 1.0, 1.3);
             imagePickerController.delegate = self.overlayView;
             // as a delegate we will be notified when pictures are taken and when to dismiss the image picker
             self.overlayView=[self.storyboard instantiateViewControllerWithIdentifier:@"OverlayViewController"];
             [self.view addSubview:imagePickerController.view];
             [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showSlider) name:@"showSlider" object:nil];
             imagePickerController.cameraOverlayView =self.overlayView.view;
             CGSize screenSize = [[UIScreen mainScreen] bounds].size;
             float cameraAspectRatio = 4.0 / 4.0; //! Note: 4.0 and 4.0 works
             float imageWidth = floorf(screenSize.width * cameraAspectRatio);
             float scale = ceilf((screenSize.height / imageWidth) * 10.0) / 10.0;
             self.imagePickerController.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
          } else {
             [self.view addSubview:self.overlayView.view]; 
        }
     }
    

    事实上,在将 cameraAspectRatio 调整为 4.0、4.0 后,一切正常。然而,当以横向显示应用程序时,图像和控件会颠倒过来。这就是我的门把手显示的方式。此外,当我将 iPhone 指向上方时,图像会横向移动,反之亦然。 它可以修复还是我需要放弃横向选项?

    【讨论】:

      【解决方案3】:

      对于任何可以使用它的人来说,他就是swift中的代码:

      @IBAction func takePhoto(_ sender: Any) {
          imagePicker =  UIImagePickerController()
          imagePicker.delegate = self
          imagePicker.sourceType = .camera
          imagePicker.cameraCaptureMode = .photo
          imagePicker.cameraDevice = .front
          imagePicker.cameraOverlayView?.frame = view.frame
          imagePicker.showsCameraControls = false
          imagePicker.isNavigationBarHidden = true
          imagePicker.isToolbarHidden = true
          let screenSize = UIScreen.main.bounds.size
          let cameraAspectRatio: Float = 4.0 / 4.0
          let imageWidth = floorf(Float(screenSize.width * CGFloat(cameraAspectRatio)))
          let scale = ((screenSize.height / CGFloat(imageWidth)) * 10.0).rounded() / 10.0;
          imagePicker.cameraViewTransform = CGAffineTransform(scaleX: CGFloat(scale), y: CGFloat(scale))
          
      
          present(imagePicker, animated: false, completion: nil)
      }
      

      我的情况是,我通过按钮调用此屏幕。

      【讨论】:

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