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

Posted

技术标签:

【中文标题】iOS SDK - 使用 UIImagePickerController 时如何恢复状态栏?【英文标题】:iOS SDK - How to get the status bar back when using UIImagePickerController? 【发布时间】:2011-04-02 07:46:33 【问题描述】:

一旦我将 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];

【问题讨论】:

【参考方案1】:

我也必须在相机应用中做同样的事情。显然,除了将状态栏设置为不隐藏之外,您还必须在相机视图使其消失后重置其样式。试试这个:

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

【讨论】:

布拉德,这对我不起作用,我在 loadView、viewDidLoad 和 viewDidAppear 中都这样做无济于事。 布拉德,这对我来说效果很好。事实上,在相机和照片库sourceType之间切换时,我不得不使用setStatusBarHidden。 我如何获得这个状态栏的句柄,以便我可以在我的应用程序在后台显示一些文本? -setStatusBarHidden:animated 已弃用,使用 -setStatusBarHidden:withAnimation: 代替,请在下面查看 alex 的答案。【参考方案2】:

接受的答案的解决方案同时被弃用。

使用

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

而不是

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

动画参数的有效值为UIStatusBarAnimationNoneUIStatusBarAnimationFadeUIStatusBarAnimationSlide。详情见documentation。

【讨论】:

【参考方案3】:

在阅读本文并发现没有一个答案有效后,我设法通过执行以下操作使其正常工作:

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

例如:

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

【讨论】:

【参考方案4】:

将您的 UIImagePicker 添加到根视图(即导航控制器或 TabbarController)

[self.tabBarController presentModalViewController:imagePickerController animated:YES];

之后就可以使用了

- (void)imagePickerController:(UIImagePickerController *)picker 
            didFinishPickingImage:(UIImage *)image
                      editingInfo:(NSDictionary *)editingInfo

      // do your stuff
     [picker dismissModalViewControllerAnimated:YES];

关闭您的 ImagePicker。

【讨论】:

您好 Henrik,感谢您的回复。我希望状态栏一直可见。这可能吗?【参考方案5】:

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

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

【讨论】:

【参考方案6】:

这些解决方案均不适用于 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];
);

这是非常hacky和错误的。

我花了半天时间寻找解决方案,然后决定只使用 AVFoundation 方法,我花了一个小时来实现使用 AVCaptureSession 和 AVCaptureStillImageOutput 所需的相同基本照片捕获。而且它的效果也更好 - AVCaptureSession 比 UIImagePickerController 启动得更快,与 UIImagePicker 相机预览相比,AVCaptureVideoPreviewLayer 在现代设备上的帧速率要好得多。

【讨论】:

以上是关于iOS SDK - 使用 UIImagePickerController 时如何恢复状态栏?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 13 SDK 的 Phonegap 构建

使用 iOS 7 SDK 的随机 iOS 6 崩溃

使用 xcode 5 (iOS 7 sdk) 构建 iOS 7 UI

使用 iOS6 SDK 在 iOS7 上的默认 UIProgressView 渲染

如何使用 iOS 6 SDK 解决 hidesBottomBarWhenPushed 的奇怪行为?

如何在使用 facebook-ios-sdk 的应用中实现聊天