ios 如何在 UIImagepickercontroller 中隐藏状态栏?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18760710/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 01:09:11  来源:igfitidea点击:

How to hide status bar in UIImagepickercontroller?

iosobjective-ciphoneios7statusbar

提问by Shailendra Kr Gangwar

I am new to iOS development. I am trying to hide status bar in UIImagePickerController. Whenever I click on "Take photo", status bar appears. It doesn't hide. I want status bar to be hidden only in UIImagePickerController.

我是 iOS 开发的新手。我试图在UIImagePickerController. 每当我单击“拍照”时,都会出现状态栏。它不会隐藏。我希望状态栏仅隐藏在UIImagePickerController.

Here is my code,

这是我的代码,

- (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];
}

How to hide the status bar on UIImagePickerController?

如何隐藏状态栏UIImagePickerController

采纳答案by ConfusedDeer

I had an issue where in iOS7 my status bar was not being hidden. I hid it programmatically and it still displayed in iOS7, but when ran in iOS6 the status bar would hide appropriately. You have to go to the plist and add the following:

我有一个问题,在 iOS7 中我的状态栏没有被隐藏。我以编程方式隐藏它,它仍然显示在 iOS7 中,但是当在 iOS6 中运行时,状态栏会适当地隐藏。您必须转到 plist 并添加以下内容:

'view controller-based status bar appearance' and set to NO.

“基于视图控制器的状态栏外观”并设置为 NO。

If you want the status bar to re-appear in other view controllers and only be hidden on a particular VC, then you set the status bar to hidden YES when the VC loads. When the VC will disappear you set the status bar hidden back to NO.

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

- (void)viewDidLoad
{

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

}

and when the controller will disappear you add the following to set the status bar so it is no longer hidden and will display on the next View:

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

-(void)viewWillDisappear:(BOOL)animated{

     [[UIApplication sharedApplication] setStatusBarHidden:NO];

}

setStatusBarHidden:withAnimation:if you want some smooth animation

setStatusBarHidden:withAnimation:如果你想要一些流畅的动画

回答by Alexandru Dranca

This worked fine for me:

这对我来说很好:

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

Edit: As of today i just found out that in your info.plist, if you just copy-paste view controller-based status bar appearance there it won't work ... you have to hit enter on a property, and scroll to the last one of them so you will have autocomplete to :view controller-based status bar appearance and an boolean, with no. I tried multiple times but it does not work just copying. Have a nice day.

编辑:截至今天,我刚刚发现在您的 info.plist 中,如果您只是复制粘贴基于视图控制器的状态栏外观,它将不起作用……您必须在属性上按 Enter,然后滚动到其中的最后一个,因此您将自动完成:查看基于控制器的状态栏外观和布尔值,没有。我尝试了多次,但它不能仅复制。祝你今天过得愉快。

回答by Silvertaurus

The solution I found for applications build around : "View controller-based status bar appearance" set to YES

我为应用程序找到的解决方案是:“基于控制器的状态栏外观”设置为“是”

I did add 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

The method childViewControllerForStatusBarHiddenis used rarely, but image picker do use it, thats why might cause some troubles

childViewControllerForStatusBarHidden方法很少使用,但是图片选择器确实使用它,这就是为什么可能会引起一些麻烦

You may also implement UIViewController singleton, with method which returns YES or NO, based on its property. Then your View controleller implements childViewControllerForStatusBarHiddenreturning the above singleton. Changing singleton property automatically change statusbar in app. There also is twin method childViewControllerForStatusBarStyle

您还可以使用基于其属性返回 YES 或 NO 的方法来实现 UIViewController 单例。然后你的视图控制器实现childViewControllerForStatusBarHidden返回上面的单例。更改单例属性会自动更改应用程序中的状态栏。还有孪生方法 childViewControllerForStatusBarStyle



However for 2014, iOS8, see this https://stackoverflow.com/a/18960308/294884

但是对于 2014 年的 iOS8,请参阅此https://stackoverflow.com/a/18960308/294884

回答by user2797041

subclass UIImagePickerController ... mine is V1ImagePickerController ...

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

.m file looks like this:

.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

the childViewControllerForStatusBarHidden is the key!

childViewControllerForStatusBarHidden 是关键!

回答by metsburg

If you want to disable the status bar from plist, try this:

如果要从 plist 禁用状态栏,请尝试以下操作:

  1. Status bar is initially hidden : YES
  2. View controller-based status bar appearance : NO
  1. 状态栏最初是隐藏的:是
  2. 基于视图控制器的状态栏外观:NO

this is necessary for iOS 7, works for me. I do not know if there are some other techniques for doing this in iOS7. Set these two tags in your info.plist.

这对于 iOS 7 是必需的,对我有用。我不知道在 iOS7 中是否还有其他一些技术可以做到这一点。在 info.plist 中设置这两个标签。

Everytime your viewcontroller appears, in viewDidLoad or when image picker controller finishes , use this:

每次您的视图控制器出现时,在 viewDidLoad 或图像选择器控制器完成时,请使用以下命令:

 - (void) imagePickerController:(UIImagePickerController *)picker1 didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
{
   [[UIApplication sharedApplication] setStatusBarHidden:YES];
 .
 .
 .
 .
 }

回答by jbg7474

I used Silvertaurus's answer above, but with a little modification to the prefersStatusBarHiddenmethod that I thought was very helpful:

我使用了上面 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

This keeps the status bar up for the image picker when the camera is not displayed.

当未显示相机时,这会使图像选择器的状态栏保持向上。

回答by kanobius

You can do it with a category:

你可以用一个类别来做到这一点:

@interface UIImagePickerController (HideStatusBar)

@end


@implementation UIImagePickerController (HideStatusBar)

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

@end

Source: https://gist.github.com/psobko/9493473

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

回答by Ganesh

Please try this.

请试试这个。

? Setting a delegate for the UIImagePickerController

? 为UIImagePickerController

? hide the status bar in the delegate's navigationController:didShowViewController:animated: function.

? 在委托的 navigationController:didShowViewController:animated: 函数中隐藏状态栏。

E.G:

例如:

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

回答by Adarsh V C

Try this

尝试这个

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

Also check this discussion.

另请查看此讨论

回答by D-eptdeveloper

-(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];
}

that might help you to achieve what you want.

这可能会帮助你实现你想要的。