简体   繁体   English

如何在UIImagepickercontroller中隐藏状态栏?

[英]How to hide status bar in UIImagepickercontroller?

I am new to iOS development. 我是iOS开发的新手。 I am trying to hide status bar in UIImagePickerController . 我试图在UIImagePickerController隐藏状态栏。 Whenever I click on "Take photo", status bar appears. 每当我点击“拍照”时,都会出现状态栏。 It doesn't hide. 它没有隐藏。 I want status bar to be hidden only in 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上隐藏状态栏?

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. 编辑:截至今天,我刚刚在你的info.plist中发现,如果你只是复制粘贴基于视图控制器的状态栏外观那里它将无法工作...你必须在属性上按Enter键,然后滚动到最后一个,所以你将自动完成:查看基于控制器的状态栏外观和布尔值,没有。 I tried multiple times but it does not work just copying. 我尝试了多次,但它只是复制不起作用。 Have a nice day. 祝你今天愉快。

The solution I found for applications build around : "View controller-based status bar appearance" set to YES 我找到的应用程序解决方案围绕:“查看基于控制器的状态栏外观”设置为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 childViewControllerForStatusBarHidden is 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. 您还可以实现UIViewController单例,其方法根据其属性返回YES或NO。 Then your View controleller implements childViewControllerForStatusBarHidden returning the above singleton. 然后你的View controleller实现了childViewControllerForStatusBarHidden返回上面的单例。 Changing singleton property automatically change statusbar in app. 更改单身人士属性会自动更改应用中的状态栏。 There also is twin method childViewControllerForStatusBarStyle 还有双方childViewControllerForStatusBarStyle


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

I had an issue where in iOS7 my status bar was not being hidden. 我有一个问题,在iOS7中我的状态栏没有被隐藏。 I hid it programmatically and it still displayed in iOS7, but when ran in iOS6 the status bar would hide appropriately. 我以编程方式隐藏它,它仍然显示在iOS7中,但是当在iOS6中运行时,状态栏会适当隐藏。 You have to go to the plist and add the following: 你必须去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. 如果希望状态栏重新出现在其他视图控制器中并且只在特定VC上隐藏,则在VC加载时将状态栏设置为隐藏YES。 When the VC will disappear you set the status bar hidden back to NO. 当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:如果你想要一些流畅的动画

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是关键!

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 查看基于控制器的状态栏外观:否

this is necessary for iOS 7, works for me. 这对iOS 7来说是必要的,适合我。 I do not know if there are some other techniques for doing this in iOS7. 我不知道在iOS7中是否还有其他一些技术可以做到这一点。 Set these two tags in your info.plist. 在info.plist中设置这两个标签。

Everytime your viewcontroller appears, in viewDidLoad or when image picker controller finishes , use this: 每次viewcontroller出现时,在viewDidLoad中或图像选择器控制器完成时,使用:

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

I used Silvertaurus's answer above, but with a little modification to the prefersStatusBarHidden method 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. 这样可以在未显示摄像机时保持图像选择器的状态栏。

Try this 试试这个

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

Also check this discussion . 另请查看此讨论

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:function。

EG: 例如:

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

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

-(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. 这可能会帮助你实现你想要的。

如果您想继续使用ViewController-Based Status Bar Appearance请尝试在此处发布我的答案

In my case I had to use presentViewController to show UIImagePickerViewController (iOS7). 在我的情况下,我不得不使用presentViewController来显示UIImagePickerViewController(iOS7)。

1- Set View controller-based status bar appearance to NO in .plist 2- Create a category for UIImagePickerController and in viewDidLayoutSubviews: 1-在.plist中将基于控制器的状态栏外观设置为NO 2-为UIImagePickerController和viewDidLayoutSubviews创建一个类别:

- (void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}

3- Added the two following methods to the category: 3-在该类别中添加了以下两种方法:

- (BOOL)prefersStatusBarHidden{
    return YES;
}

- (UIViewController *)childViewControllerForStatusBarHidden{
    return nil;
}

I hope this will help. 我希望这将有所帮助。

i think i solved this in a pretty simple way without subclassing and using plist. 我想我在没有子类化和使用plist的情况下以一种非常简单的方式解决了这个问题。 it only hides for UIImagePickerController. 它只隐藏UIImagePickerController。

this example is for bringing up the photo gallary only, but i imagine you can apply it in the same way to anywhere with in uiimagepickercontroller 这个例子仅用于提升照片,但我想你可以用同样的方式将它应用到uiimagepickercontroller中的任何地方

- (void)showGallary
{
  [CATransaction begin];
  [CATransaction setCompletionBlock:^{
      [[UIApplication sharedApplication] setStatusBarHidden:YES];
      [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
  }];

  imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

  [CATransaction commit];
}

I wanted to have the status bar hidden all the time, opening the image picker shows it. 我想让状态栏一直隐藏,打开图像选择器显示它。 To hide it again the following worked for me as of iOS 8: 为了隐藏它,从iOS 8开始,以下版本对我有用:

-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [self dismissViewControllerAnimated:YES completion:^{
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }];
}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [self dismissViewControllerAnimated:YES completion:^{
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }];

    // do stuff with photo
}

I have View controller-based status bar appearance set to NO 我将View controller-based status bar appearance设置为NO

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM