Как скрыть строку состояния в 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?

14 ответов

Решение

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

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

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

- (void)viewDidLoad
{

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

}

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

-(void)viewWillDisappear:(BOOL)animated{

     [[UIApplication sharedApplication] setStatusBarHidden:NO];

}

setStatusBarHidden:withAnimation: если вы хотите плавную анимацию

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

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

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

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

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

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


Однако для 2014 года, iOS8, см. Этот /questions/24014225/uiimagepickercontroller-lomaet-vneshnij-vid-stroki-sostoyaniya/24014229#24014229

Подкласс 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 является ключом!

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

  1. Строка состояния изначально скрыта: ДА
  2. Просмотреть внешний вид строки состояния на основе контроллера: НЕТ

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

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

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

Я использовал ответ 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

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

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

• Назначение делегата для UIImagePickerController

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

НАПРИМЕР:

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

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

@interface UIImagePickerController (HideStatusBar)

@end


@implementation UIImagePickerController (HideStatusBar)

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

@end

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

Попробуй это

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

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

Я хотел все время скрывать строку состояния, открывая окно выбора изображений. Чтобы скрыть это снова, у меня работало с 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

Попробуйте мой ответ, опубликованный здесь, если вы хотите продолжать использовать ViewController-Based Status Bar Appearance,

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

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

В моем случае мне пришлось использовать 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;
}

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

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

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

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

  imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

  [CATransaction commit];
}
Другие вопросы по тегам