如何在UIImagepickercontroller中隐藏状态栏?

31

我对iOS开发还很新,正在尝试在UIImagePickerController中隐藏状态栏。每当我点击 “拍摄照片” 时,状态栏都会出现,无法隐藏。我希望只在UIImagePickerController中隐藏状态栏。

这是我的代码:

- (IBAction)takePhoto:(UIButton *)sender
{
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    [self presentViewController:picker animated:YES completion:NULL];
}


- (void)imagePickerController:(UIImagePickerController *)picker     didFinishPickingMediaWithInfo:(NSDictionary *)info
{   
    [self statusBar:YES];
    UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
    self.imageView.image = chosenImage;
    [picker dismissViewControllerAnimated:YES completion:NULL];

}


- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:NULL];
}


-(void)statusBar:(BOOL)status
{
    [[UIApplication sharedApplication] setStatusBarHidden:status];
}

如何在UIImagePickerController上隐藏状态栏?


按照我提供的步骤尝试我的代码,你将能够实现你的输出。 - D-eptdeveloper
我已在开发者论坛发布了一个解决方案,因为iOS7仍然受到保密协议的限制。https://devforums.apple.com/message/888587#888587 - 1b0t
13个回答

47

这对我很有效:

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

编辑:截至今日我刚刚发现,在你的info.plist中,如果你只是复制粘贴视图控制器的状态栏外观,它不会起作用……你必须在一个属性上按回车键,并滚动到它们的最后一个,这样你就可以自动完成:基于视图控制器的状态栏外观和布尔值,没有别的了。我尝试了多次,但仅仅复制不起作用。祝您拥有愉快的一天。


这在iOS7上运行得非常完美,但是当弹出照片视图时,新照片位于底部,用户必须将其滚动到底部。 - akin
使用“基于视图控制器的状态栏外观”并将其设置为NO,我仍然遇到了问题,但这个方法解决了问题,谢谢!!! - xarly
这会不会在打开UIImagePickerController后关闭整个应用程序的状态栏?还是说只有相机视图才会被关闭?我只想关闭相机视图的状态栏。 - sffc
这对我也起作用了!但是,当UIImagePickerController出现时,我注意到了一个小“故障”。 我发现如果使用以下方法,它可以无故障地工作:[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; - Frederic Adda
"setStatusBarHidden" 在 iOS 9 上已被弃用。 - Nobin Thomas
显示剩余2条评论

33

针对“基于视图控制器的状态栏外观”设置为YES的应用程序所采取的解决方案:

我添加了一个类别(Category):

//UIImagePickerController+StatusBarHidden.h
#import <UIKit/UIKit.h>

@interface UIImagePickerController (StatusBarHidden)
@end

//UIImagePickerController+StatusBarHidden.h
#import "UIImagePickerController+StatusBarHidden.h"

@implementation UIImagePickerController (StatusBarHidden)

-(BOOL) prefersStatusBarHidden {
    return YES;
}

-(UIViewController *) childViewControllerForStatusBarHidden {
    return nil;
}

@end

方法childViewControllerForStatusBarHidden很少使用,但是图片选择器确实会使用它,这可能会导致一些问题。

您还可以实现UIViewController单例,其中包含基于其属性返回YES或NO的方法。 然后,您的视图控制器实现childViewControllerForStatusBarHidden,返回上述单例。 更改单例属性会自动更改应用程序中的状态栏。 还有一个双胞胎方法childViewControllerForStatusBarStyle


但是对于2014年的iOS8,请查看此https://dev59.com/cWMk5IYBdhLWcg3w5Bzy#18960308


1
文档说明不支持子类化。所以这是一个不错的选择。非常好用(一旦我将视图控制器基于状态栏外观设置回YES)。谢谢。 - cloudsurfin
这对我很有效,关键是将childViewControllerForStatusBarHidden设置为返回nil。所有其他解决方案在状态栏显示方面都是全有或全无的。 - farhadf
你救了我的一天!正如@farhadf所写,childViewControllerForStatusBarHidden是关键。 - Błażej
太棒了。完美地运行。 - user

19

在iOS7中,我的状态栏没有被隐藏。我使用编程方式进行了隐藏,但在iOS7中仍然显示,但在iOS6中运行时,状态栏会适当地隐藏。你需要打开plist文件并添加以下内容:

'view controller-based status bar appearance' 然后设置为NO。

如果您想让状态栏在其他视图控制器中重新出现,并且仅在特定VC上隐藏,则可以在VC加载时将状态栏设置为隐藏YES。 当VC消失时,将状态栏隐藏设回NO。

- (void)viewDidLoad
{

    [super viewDidLoad];
    [[UIApplication sharedApplication] setStatusBarHidden:YES];

}

当控制器消失时,您需要添加以下内容来设置状态栏,以便它不再隐藏,并在下一个视图上显示:

-(void)viewWillDisappear:(BOOL)animated{

     [[UIApplication sharedApplication] setStatusBarHidden:NO];

}

setStatusBarHidden:withAnimation: 如果您想要一些平滑的动画效果


2
我想通过我的应用程序显示所有内容。我只想在UIImagepickerController中隐藏它。 - Shailendra Kumar Gangwar
4
我在 pList 中将“view controller-based status bar appearance”设置为NO,然后在 appDelegate 中写下 [application setStatusBarHidden:NO]; 和 [application setStatusBarStyle:UIStatusBarStyleDefault]; 这些对我有用。谢谢。 - Shailendra Kumar Gangwar
1
我也遇到了同样的问题。但是将“View controller-based status bar appearance”设置为NO可以隐藏状态栏,但是如果你浏览照片,它会再次出现。 - RockandRoll
这并不仅适用于uiimagepickercontroller。然而,您可以每次加载视图时使用CATransaction块来解决问题。 [CATransaction begin]; [CATransaction setCompletionBlock:^{ [[UIApplication sharedApplication] setStatusBarHidden:YES]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; }];imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;[CATransaction commit]; - greenhouse

18

子类 UIImagePickerController ... 我的是 V1ImagePickerController ...

.m 文件看起来像这样:

#import "V1ImagePickerController.h"

@interface V1ImagePickerController ()

@end

@implementation V1ImagePickerController

- (void)viewDidLoad
{
    [super viewDidLoad];

    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)   // iOS7+ only
    {
        self.edgesForExtendedLayout = UIRectEdgeNone;

        [self prefersStatusBarHidden];
        [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    }
}

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

@end

childViewControllerForStatusBarHidden是关键!


2
-(BOOL)prefersStatusBarHidden { return self.sourceType== UIImagePickerControllerSourceTypeCamera ? YES : NO; }-(BOOL)prefersStatusBarHidden { return self.sourceType == UIImagePickerControllerSourceTypeCamera? YES: NO; } - ngzhongcai
你不需要重写viewDidLoad方法,至少对于状态栏的东西来说是这样。 - jrturton
还可以在这里查看Masmor的答案:https://dev59.com/0HbZa4cB1Zd3GeqPLvKw 这是唯一的方法。 - Fattie

7
如果您想通过plist禁用状态栏,请尝试以下步骤:
  1. 状态栏最初被隐藏:是
  2. 基于视图控制器的状态栏外观:否
这对iOS 7很必要,我已经验证过。我不知道在iOS7中是否还有其他技术可以实现此目的。请在info.plist中设置这两个标记。
每当您的视图控制器出现时,在viewDidLoad或图像选择器完成时,使用以下代码:
 - (void) imagePickerController:(UIImagePickerController *)picker1 didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
{
   [[UIApplication sharedApplication] setStatusBarHidden:YES];
 .
 .
 .
 .
 }

1
当您使用图像选择器时,状态栏会淡入...但是当您完成使用它时,此代码会立即隐藏它...我建议使用以下代码将淡出动画添加到您的状态栏解除。[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; - Albert Renshaw
还有!不要忘记将那段代码(他的或者我的)放入你的- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker {中!以防用户点击“取消”而没有选择照片! - Albert Renshaw

6
我使用了Silvertaurus上面的答案,但对prefersStatusBarHidden方法进行了一些修改,我认为这非常有帮助:
//UIImagePickerController+StatusBarHidden.h
#import <UIKit/UIKit.h>

@interface UIImagePickerController (StatusBarHidden)
@end

//UIImagePickerController+StatusBarHidden.h
#import "UIImagePickerController+StatusBarHidden.h"

@implementation UIImagePickerController (StatusBarHidden)

-(BOOL) prefersStatusBarHidden {
    if (self.sourceType==UIImagePickerControllerSourceTypeCamera) {
        return YES;
    } else {
        return NO;
    }
}

-(UIViewController *) childViewControllerForStatusBarHidden {
    return nil;
}

@end

这将使图像选择器的状态栏在未显示相机时保持上升。

运行得非常好,谢谢。 - Poles

1
你可以通过分类来实现:
@interface UIImagePickerController (HideStatusBar)

@end


@implementation UIImagePickerController (HideStatusBar)

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

@end

来源:https://gist.github.com/psobko/9493473


我建议在子类中采用相同的方法,但这种方法绝对有效!谢谢! - Sam Soffes

1
请尝试这个。
[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];

也请检查这个 讨论

1
无法运行。每当我点击“拍照”时,状态栏就会出现。 - Shailendra Kumar Gangwar

1
请尝试以下操作:

• 为UIImagePickerController设置代理。

• 在代理的navigationController:didShowViewController:animated:函数中隐藏状态栏。

E.G:

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

0
-(IBAction)takePhoto:(UIButton *)sender
{
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    [self statusBar:TRUE];
    [self presentViewController:picker animated:YES completion:NULL];
}


-(void)imagePickerController:(UIImagePickerController *)picker      didFinishPickingMediaWithInfo:(NSDictionary *)info
{        
    UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
    self.imageView.image = chosenImage;
    [self statusBar:FALSE];
    [picker dismissViewControllerAnimated:YES completion:NULL];
}


-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [self statusBar:FALSE];
    [picker dismissViewControllerAnimated:YES completion:NULL];
}


-(void)statusBar:(BOOL)status
{
    [[UIApplication sharedApplication] setStatusBarHidden:status];
}

这可能会帮助您实现您想要的目标。


我刚试了这段代码。在视图控制器中,状态栏被隐藏了。但在UIImagePickerController中,它又出现了。 - Shailendra Kumar Gangwar
好的,我正在根据你的问题编辑我的答案,请按照这种方式尝试并删除其他代码。 - D-eptdeveloper
好的,当然。这将是一个很大的帮助。 - Shailendra Kumar Gangwar
@ShailendraKrGangwar:请尝试我的修改后的代码,并确保您没有在其他任何地方调用statusbar方法。 - D-eptdeveloper
现在不知道缺少什么,唯一的方法是如果您可以分享您的项目,这样我就可以看看哪里出了问题,或者将您的完整viewController.m文件粘贴到您的问题中。 - D-eptdeveloper

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