iPhone - 编程方式移除状态栏

9

我做了一个应用程序,实现了iPhone的相机功能。 当用户完成选择图片后,状态栏会重新出现! 我该如何确保状态栏保持隐藏?

以下是我的代码:

-(IBAction)pickImage:(id)sender {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;

picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
[self presentModalViewController:picker animated:YES];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
[picker dismissModalViewControllerAnimated:YES];
background.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

}

如果我做错了什么,请指出来!谢谢,Rafee


如果在你的应用程序info.plist中将状态栏初始设置为隐藏,那么状态栏将保持隐藏。 - Mick MacCallum
1
不,状态栏不会保持隐藏。我刚刚对此进行了测试;这似乎是一个错误,对于使用UIImagePickerControllerSourceTypeSavedPhotosAlbum类型的UIImagePicker的dismissModalViewController来说,这个错误是100%可复制的(至少对我来说是这样)。这在相机和照片库中不会发生。 - Tom Pace
6个回答

29
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

如果需要的话,您可以选择其他动画样式。


实际上,UIKit 中存在一个错误,这正是 OP 正在经历的。 - Tom Pace
完美运行,我之前在使用imagePicker时也遇到了同样的问题。 - David Ansermot
在iOS 9中已被弃用 - cdub

20

在 iOS 7 中,UIViewController 上有一个方法 "prefersStatusBarHidden"。为了隐藏状态栏,在你的视图控制器中添加此方法并返回 YES:

- (BOOL) prefersStatusBarHidden
{
    return YES;
}

4
在这种情况下,我们需要分两步来操作。
第一步: 在info.plist文件中添加以下内容:"View controller-based status bar appearance" 值为 "NO"。
第二步: 使用/调用UIImagePickerController的委托(delegate)代码。
 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
     if([navigationController isKindOfClass:[UIImagePickerController class]])
         [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
 }

1

iOS 7及以上的版本,你可以使用以下代码来隐藏和显示状态栏:

@interface ViewController()

@property (nonatomic, getter=isStatusBarHidden) BOOL statusBarHidden;

@end

@implementation ViewController


  ... other codes

- (BOOL)prefersStatusBarHidden {
    return self.isStatusBarHidden;
}

- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
    return UIStatusBarAnimationFade;
}

- (void)hideStatusBar {
    self.statusBarHidden = YES;
    [self setNeedsStatusBarAppearanceUpdate];
}

- (void)showStatusBar {
    self.statusBarHidden = NO;
    [self setNeedsStatusBarAppearanceUpdate];
}

@end

0

UIViewController与UIImagePicker相关联的dismiss机制中似乎存在一个bug,当sourceType为UIImagePickerControllerSourceTypeSavedPhotosAlbum时。

在调用dismissModalViewController(加上completion参数的方法)的瞬间,UIApplication的status bar hidden属性立即从YES更改为NO,并且在步过dismiss时绘制。

这只对使用全屏视图的应用程序非常明显。我的当前应用程序项目就是这样,而且在呈现之前我控制了视图控制器视图的框架,因此UIImagePicker并不是全屏的。这使得这个bug非常明显。我花了4-5个小时确定了原因,这是最后确定的结论,对于sourceType Camera和PhotoLibrary,该bug不会发生。

因此,如果您想要一个完美的全屏应用程序,并且想要呈现一个无bug的UIImagePicker,请避免使用UIImagePickerControllerSourceTypeSavedPhotosAlbum。


0

Grand Central Dispatch是你的好朋友,使用这种方法,当选择器被显示或之后,你将不会看到状态栏出现。

- (void)hideStatusBar
{
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)])
    {
        [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    }
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
}

- (BOOL)prefersStatusBarHidden {
    return YES;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self hideStatusBar];
    double delayInSeconds = 0.2;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self hideStatusBar];
    });
}

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