iPhone - 以编程方式删除状态栏

Posted

技术标签:

【中文标题】iPhone - 以编程方式删除状态栏【英文标题】:iPhone - Remove status bar programmatically 【发布时间】:2012-04-05 09:40:47 【问题描述】:

我制作了一个实现 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"];


如果我做错了什么,请指出! 谢谢, 拉菲

【问题讨论】:

如果您将状态栏设置为最初隐藏在应用程序 info.plist 中,则状态栏将保持隐藏状态。 不,状态栏不会保持隐藏状态。我刚刚对此进行了测试;这似乎是一个错误,对于类型为 UIImagePickerControllerSourceTypeSavedPhotosAlbum 的 UIImagePicker,在dismissModalViewController 上是 100% 可复制的(至少对我而言)。 Camera 和 PhotoLibrary 都不会发生这种情况。 【参考方案1】:
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

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

【讨论】:

UIKit 中实际上存在一个错误,OP 正在经历。 完美运行,与 imagePicker 有同样的问题 现在在 ios 9 中已弃用【参考方案2】:

在 iOS 7 中,UIViewController 上有一个方法“prefersStatusBarHidden”。要隐藏状态栏,请将此方法添加到您的视图控制器并返回 YES:

- (BOOL) prefersStatusBarHidden

    return YES;

【讨论】:

【参考方案3】:

在这种情况下,我们使用 2 个步骤

第一步: 添加 info.plist:“查看基于控制器的状态栏外观”,值为“NO”

第二步:通过 UIImagePickerController 的委托使用/调用此代码

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

     if([navigationController isKindOfClass:[UIImagePickerController class]])
         [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
 

【讨论】:

【参考方案4】:

在 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

【讨论】:

【参考方案5】:

与 UIImagePicker 关联的 UIViewController 的关闭机制中似乎存在错误,sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum。

在调用dismissModalViewController的那一刻(加上有completion的方法:)UIApplication的状态栏hidden属性瞬间从YES变为NO,并且在踩过dismiss的那一刻被绘制...

这对于使用全屏视图的应用程序来说是非常明显的。我当前的应用程序项目确实如此,而且我在呈现之前控制视图控制器视图的框架,因此 UIImagePicker 不是全屏的。这使得错误非常明显。我花了 4-5 个小时确定原因,这是最终确定的结论,并且 sourceType Camera 和 PhotoLibrary 都不会出现该错误。

因此,如果您想要一个完美的全屏应用并希望呈现无错误的 UIImagePicker,请避免使用 UIImagePickerControllerSourceTypeSavedPhotosAlbum

【讨论】:

【参考方案6】:

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];
    );

【讨论】:

以上是关于iPhone - 以编程方式删除状态栏的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取 iOS 状态栏高度

如何设置状态栏或安全区域以删除 iPhone X 上的空白?

添加新 UIWindow 时以编程方式隐藏状态栏?

以编程方式点击状态栏后如何触发“scrollsToTop”?

如何在 iOS 8 中以编程方式隐藏状态栏 [重复]

我们可以以编程方式更改状态栏或通知栏位置吗