UIImagePickerController黑色不透明底部栏

4
我需要我的视图在拍照时有一个黑色不透明的顶部和底部栏。我希望它看起来像这个网址中的图片:http://imgur.com/Qdbp6fP。实际上,这是我在我的iPhone 5(运行iOS 7)上编写代码时拥有的效果。但是当我在一台运行iOS 7的iPhone 4S上编译我的代码时,底部栏变得透明了 - 视图从上到下变成了相机,就像现在的相机应用程序。即使是“拍照”按钮也会变成透明的,就像SnapChat一样。我很讨厌这样。我需要更改什么设置才能使我的iPhone 4S上的底部栏变为不透明?我正在使用自动布局。以下是我的viewDidAppear:
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        self.anImagePickerController = [UIImagePickerController new];
        self.anImagePickerController.delegate = self;
        self.anImagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
        self.anImagePickerController.showsCameraControls = YES;

        [self presentViewController:self.anImagePickerController animated:NO completion:Nil];
    }
3个回答

1
以下代码将完全按照您的要求执行。我发现这个方法是因为我想做与您完全相同的事情,并且认为自己编写摄像机控制器是完全不必要的。
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.allowsEditing = YES;
imagePicker.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;
imagePicker.delegate = self;

 [self presentViewController:imagePicker animated:YES completion:^()
 {   
     for (UIView *subview in imagePicker.view.subviews)
     {
        if([NSStringFromClass([subview class]) isEqualToString:@"UINavigationTransitionView"])
        {
            UIView *theView = (UIView *)subview;

            for (UIView *subview in theView.subviews)
            {
               if([NSStringFromClass([subview class]) isEqualToString:@"UIViewControllerWrapperView"])
               {
                   UIView *theView = (UIView *)subview;

                    for (UIView *subview in theView.subviews)
                    {
                         if([NSStringFromClass([subview class]) isEqualToString:@"PLCameraView"])
                         {
                             UIView *theView = (UIView *)subview;

                             for (UIView *subview in theView.subviews)
                             {
                                 if([NSStringFromClass([subview class]) isEqualToString:@"CAMTopBar"])
                                 {
                                      subview.backgroundColor = [UIColor blackColor];
                                 }
                                 if([NSStringFromClass([subview class]) isEqualToString:@"CAMBottomBar"])
                                 {
                                      subview.backgroundColor = [UIColor blackColor];
                                 }
                                 if([NSStringFromClass([subview class]) isEqualToString:@"PLCropOverlay"])
                                 {
                                     UIView *theView = (UIView *)subview;

                                     for (UIView *subview in theView.subviews)
                                     {
                                         if([NSStringFromClass([subview class]) isEqualToString:@"PLCropOverlayBottomBar"])
                                         {
                                              UIView *theView = (UIView *)subview;

                                              for (UIView *subview in theView.subviews)
                                              {
                                                  if([NSStringFromClass([subview class]) isEqualToString:@"PLCropOverlayPreviewBottomBar"])
                                                  {
                                                      subview.backgroundColor = [UIColor blackColor];
                                                  }
                                              }
                                          }
                                      }
                                  }
                              }
                          }
                      }
                 }
             }
         }
     }
}];

7
因为打破“嵌套花括号”的记录而点赞。 - matt
2
这在iOS6上可以工作吗?iOS6.1?iOS7?iOS7.1b1?iOS7.1b2?iOS7.1b3?iOS7.1?iOS7.2?iOS8? - Léo Natan
此外,在您的代码中包含诸如“UIViewControllerWrapperView”之类的字符串是让您的应用程序被商店拒绝的好方法。 - Léo Natan
真是太棒了,它真的起作用了!非常感谢!顺便说一下,我正在那个3.5英寸的iPhone上运行iOS 7,但它能在iOS 6.0的3.5英寸iPhone上工作吗? - anthoprotic
这是一个糟糕的代码,不应该建议给那些不了解的人。 - Léo Natan
显示剩余4条评论

1
我认为你不能修改UIImagePickerController的行为。在较小的屏幕设备上,由于没有足够的屏幕空间,它很可能会删除黑色条。如果你坚持这种行为,你需要使用自定义覆盖方法。你将showsCameraControls设置为NO,并提供一个cameraOverlayView,它将按照你的需求进行操作。从你的自定义覆盖视图中,当用户点击拍照按钮时,你调用图像选择器控制器上的takePicture
你可以在苹果的示例中看到一个覆盖视图的实现例子: https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010196

好吧,它并没有真正占用更多的空间,因为屏幕上仍然有一个"拍照"按钮显示。我只是不想它是透明的 - 我需要以某种方式将其设置为黑色不透明。 - anthoprotic
你需要实现叠加视图。 - Léo Natan
我已经有一个小的覆盖视图,它在“拍照”按钮上方有一个黑色背景。但是,如果我尝试将其向下移动,它会隐藏按钮。有没有办法使其滑动到“拍照”按钮下面? - anthoprotic
那看起来需要很多时间。你有什么好的教程可以推荐吗? - anthoprotic
请看我下面发布的答案。它完美地运行,我计划使用这段代码发布一个应用程序。 - klcjr89
显示剩余5条评论

0

UIImagePickerController是一个UINavigationController。你抱怨的那个条是UINavigationController的工具栏。你肯定知道,在iOS 7上,工具栏默认是透明的(或者至少是半透明的)。


嘿,马特,在界面构建器中,我设置了导航控制器呈现我的相机,并使用“不透明黑色导航栏”和“不透明黑色工具栏”。显然,它在iPhone 5上运行正常,但在4S上却不行(4英寸与3.5英寸之间的差异)。有什么解决办法吗? - anthoprotic
图像选择器控制器中的黑色条,更具体地说是相机控制器,并不是工具栏。 - Léo Natan
但是它的颜色/透明度可以改变吗? - anthoprotic
@anthoprotic 不行。相机控制器的视图层次结构是私有的,不支持更改。你只能接受现有的或者自己重新实现一个。 - Léo Natan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接