Как скрыть строку состояния в UIImagepickercontroller?

Я новичок в разработке 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?

Ответ 1

У меня была проблема, когда в iOS7 моя строка состояния не скрывалась. Я спрятал его программно, и он все еще отображается в iOS7, но при запуске в iOS6 строка состояния скроется соответствующим образом. Вы должны пойти в plist и добавить следующее:

'просмотреть внешний вид строки состояния на основе контроллера и установить значение NO.

Если вы хотите, чтобы строка состояния снова отображалась в других контроллерах представлений и была скрыта только на конкретном VC, тогда вы устанавливаете строку состояния скрытой YES при загрузке VC. Когда VC исчезнет, ​​вы установите, что строка состояния скрыта до NO.

- (void)viewDidLoad
{

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

}

и когда контроллер исчезнет, ​​вы добавите следующее, чтобы установить строку состояния, чтобы она больше не скрывалась и отображалась на следующем представлении:

-(void)viewWillDisappear:(BOOL)animated{

     [[UIApplication sharedApplication] setStatusBarHidden:NO];

}

setStatusBarHidden:withAnimation:, если вам нужна гладкая анимация

Ответ 2

Это работало отлично для меня:

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

Изменить: На сегодняшний день я только что узнал, что в вашем info.plist, если вы просто скопируете-вставьте вид на панели управления на основе контроллера, там это не сработает... вам нужно нажать enter на свойство, и прокрутите до последней из них, чтобы у вас была автозаполнение: просмотр состояния панели управления на основе контроллера и логическое, без. Я много раз пробовал, но он просто не копировал. Приятного дня.

Ответ 3

Решение, которое я нашел для приложений: "Просмотр состояния строки состояния на основе контроллера" установлен на YES

Я добавил категорию:

//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, в зависимости от его свойства. Затем ваш просмотр controleller реализует childViewControllerForStatusBarHidden, возвращая вышеописанный синглтон. Изменение свойства singleton автоматически изменяет строку состояния в приложении. Существует также двойной метод childViewControllerForStatusBarStyle


Однако для 2014 года iOS8 см. это fooobar.com/questions/44120/...

Ответ 4

подкласс UIImagePickerController... mine - это 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 - это ключ!

Ответ 5

Если вы хотите отключить строку состояния от plist, попробуйте следующее:

  • Строка состояния изначально скрыта: YES
  • Просмотр состояния панели состояния контроллера: НЕТ

это необходимо для iOS 7, работает для меня. Я не знаю, есть ли другие методы для этого в iOS7. Установите эти два тега в свой info.plist.

Каждый раз, когда появляется ваш viewcontroller, в viewDidLoad или когда контроллер выбора изображения заканчивается, используйте это:

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

Ответ 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

Это удерживает строку состояния для устройства выбора изображения, когда камера не отображается.

Ответ 7

Попробуйте это

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

Также проверьте этот обсуждение.

Ответ 8

Вы можете сделать это с помощью категории:

@interface UIImagePickerController (HideStatusBar)

@end


@implementation UIImagePickerController (HideStatusBar)

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

@end

Источник: https://gist.github.com/psobko/9493473

Ответ 9

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

что может помочь вам достичь того, чего вы хотите.

Ответ 10

Пожалуйста, попробуйте это.

• Установка делегата для UIImagePickerController

• скрыть строку статуса в делегате navigationController: didShowViewController: анимированная: функция.

например:

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

Ответ 12

В моем случае мне пришлось использовать presentViewController для отображения UIImagePickerViewController (iOS7).

1- Установить вид строки состояния на основе контроллера на NO в .plist 2- Создайте категорию для UIImagePickerController и в viewDidLayoutSubviews:

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

3 Добавили в категорию следующие два метода:

- (BOOL)prefersStatusBarHidden{
    return YES;
}

- (UIViewController *)childViewControllerForStatusBarHidden{
    return nil;
}

Надеюсь, это поможет.

Ответ 13

Я думаю, что я решил это довольно простым способом без подкласса и использования plist. он скрывается только для UIImagePickerController.

Этот пример предназначен только для воссоздания фотогалереи, но я думаю, вы можете применить его таким же образом в любом месте с помощью uiimagepickercontroller

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

  imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

  [CATransaction commit];
}

Ответ 14

Я хотел, чтобы строка состояния была скрыта все время, открыв ее, отобразите ее. Чтобы скрыть его снова, работала для меня как с 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
}

У меня View controller-based status bar appearance установлено значение NO