iOS SDK - 如何在使用UIImagePickerController时恢复状态栏?

22

当我向我的视图添加UIImagePickerController子视图时,状态栏会消失,我无法将其恢复。有没有办法保持状态栏可见?

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;


[self.view addSubview:imagePicker.view];

[imagePicker viewWillAppear:YES];
[imagePicker viewDidAppear:YES];

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
6个回答

29

我也曾在一个相机应用程序中遇到同样的问题。显然,除了将状态栏设置为不隐藏之外,还必须在相机视图使其消失后重置其样式。尝试这个:

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];

Brad,这对我不起作用,我已经在loadView,viewDidLoad和viewDidAppear中尝试了所有方法,都没有成功。 - Jesse Pepper
Brad,这对我很有效。事实上,在切换相机和照片库sourceType时,我不得不使用setStatusBarHidden。 - cpungaliya
我该如何获取状态栏的句柄,以便在我的应用程序在后台运行时在其上显示一些文本? - Namratha
2
-setStatusBarHidden:animated已被弃用,请改用-setStatusBarHidden:withAnimation:,请参考下面的Alex答案。 - lekksi

15

被接受的答案的解决方案已经过时。

使用

[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

取代

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];

animation参数的有效取值包括UIStatusBarAnimationNoneUIStatusBarAnimationFadeUIStatusBarAnimationSlide。详细信息请参阅文档


6

在阅读相关内容后,发现没有任何答案可行,我通过以下方式解决了这个问题:

• 为UIImagePickerController设置代理
• 在该代理中,在delegate的navigationController:didShowViewController:animated:函数中隐藏状态栏。

例如:

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
}

1
将您的UIImagePicker添加到根视图中(即导航控制器或选项卡控制器)。
[self.tabBarController presentModalViewController:imagePickerController animated:YES];

之后你可以使用

- (void)imagePickerController:(UIImagePickerController *)picker 
            didFinishPickingImage:(UIImage *)image
                      editingInfo:(NSDictionary *)editingInfo
{
      // do your stuff
     [picker dismissModalViewControllerAnimated:YES];
}

关闭您的ImagePicker。


嗨,Henrik,感谢您的回复。我想让状态栏一直可见。这可能吗? - dan

0

嗯,我知道你不应该这样做,但如果你子类化UIImagePickerController,你可以把它放在你的自定义类中:

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
}

0

在iOS 5.1.1上,这些解决方案都无效。 Tim的解决方案适用于iOS 4.2.1。 我在iOS 5.1.1上解决问题的唯一方法是像这样

-(void)viewDidAppear:(BOOL)animated
{
    double delayInSeconds = 0.01;
    dispatch_time_t popTime = 
            dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [[UIApplicationsharedApplication] setStatusBarHidden:NO];
});

这种方法非常不专业和错误。

我花了半天时间寻找解决方案,最终决定采用AVFoundation方法,只用了一个小时就实现了我所需的基本照片捕获功能,使用AVCaptureSession和AVCaptureStillImageOutput。而且它的效果更好 - AVCaptureSession比UIImagePickerController启动更快,在现代设备上,AVCaptureVideoPreviewLayer与UIImagePicker相比具有更好的帧率。


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