Как скрыть строку состояния iOS


219

В моем iOS-приложении строка состояния видео скрыта в некоторых контроллерах вида. Я сделал это, используя следующий код.

[[UIApplication sharedApplication] setStatusBarHidden:YES];
  • Это работает для iOS 5 и iOS 6, но не в iOS 7.

  • Я пытался с этим, в частности, посмотреть контроллер,

Например:

-(BOOL)prefersStatusBarHidden { return YES; }

Это работает хорошо, но я не могу снова показать строку состояния в родительском контроллере представления.



1
Если стиль строки состояния установлен в раскадровке, после изменения «Просмотр строки состояния на основе контроллера» (ниже), стиль, возможно, придется установить в списке, потому что настройка контроллера представления больше не будет использоваться. stackoverflow.com/questions/18924345/…
Мэтт

1
Я ответил на другой вопрос. Попробуй это. [самый простой способ скрыть строку состояния программно] [1] [1]: stackoverflow.com/a/27339754/3718498
wataru

1
Я использовал для этого трюк - я опубликовал его как pod cocoapods.org/pods/UIViewController+ODStatusBar , я надеюсь, что он будет полезен для всех
Алекс Назарский

Ответы здесь уже устарели. У меня были проблемы с поиском правильного ответа для iOS 9, когда я скрывал строку состояния ДЛЯ ПРОСТО ЭКРАНА ЗАПУСКА , поэтому ссылки ниже, так что, надеюсь, другим будет проще найти, как это сделать: stackoverflow.com/questions/34413848/…
Бен,

Ответы:


277

Вы должны добавить это значение в plist: « Просмотреть внешний вид строки состояния на основе контроллера » и установить « NO ».

введите описание изображения здесь


40
Для справки, необработанный ключUIViewControllerBasedStatusBarAppearance
Уильям Деннис

1
@ Rajneesh071 Что мне нужно сделать, если я хочу установить предпочитаемый элемент StatusBarStyle для работы, которая мне нужна "View controller-based status bar appearance" set it to "YES".?
Бимава


с какой проблемой вы сталкиваетесь?
Rajneesh071

кажется устаревшим, будет ломает ваше приложение
Бен


113

Добавьте следующую строку в viewdidload

  [[UIApplication sharedApplication] setStatusBarHidden:YES
                                        withAnimation:UIStatusBarAnimationFade];

и добавить новый метод

  - (BOOL)prefersStatusBarHidden {
          return YES;
  }

также измените файл info.plist Просмотр внешнего вида строки состояния контроллера "= НЕТ

это работает для меня


Спасибо, это работает для меня, но мне нужно добавить ниже строки в списке. «Просмотреть внешний вид строки состояния на основе контроллера» = НЕТ i, e Добавить следующую строку в viewdidload [[UIApplication sharedApplication] setStatusBarHidden: YES withAnimation: UIStatusBarAnimationFade]; и добавьте новый метод - (BOOL) prefersStatusBarHidden {return YES; } Добавить «Просмотр внешнего вида строки состояния на основе контроллера» = НЕТ в файле Plist
sandy

prefersStatusBarHiddenэто то, что сработало для меня (будь то с этим решением с другими подобными)
Абдо

34

В Plist добавить следующие свойства.

Status bar is initially hidden = YES

View controller-based status bar appearance = NO

теперь строка состояния будет скрыта.


8
Необработанными ключами будут UIStatusBarHidden и UIViewControllerBasedStatusBarAppearance
leolobato

27

Попробуйте этот простой метод:


Objective-C:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated]
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated]
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}

Swift:

override func viewWillAppear(animated: Bool) 
{
    super.viewWillAppear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)
}

override func viewWillDisappear(animated: Bool) 
{
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)
}

1
Это был чудесный ответ! Также попробуйте это с различными UIStatusBarAnimations, они довольно хороши.
ВедТопкар

Не забудьте [super viewWillAppear:animated]и[super viewWillDisappear:animated]
SamB

1
Это простое решение сработало для меня в iOS 10. Способ быть простым человеком!
coolcool1994

14

Я сделал следующее, и это похоже на работу (даже в iOS 8):

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {

        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
}

- (BOOL)prefersStatusBarHidden {
    return YES;
}

12
  • UIApplication.setStatusBarX устарела с iOS9
  • Не рекомендуется иметь UIViewControllerBasedStatusBarAppearance = NO в вашем info.plist
  • Таким образом, мы должны использовать privileStatusBarX во всех наших контроллерах представления

Но становится интереснее, когда задействован UINavigationController:

  • Если navigationBarHidden = true, вызывается дочерний объект UIViewControllerlistStatusBarX, так как дочерний элемент отображает содержимое в строке состояния.
  • Если navigationBarHidden = false, вызывается привилегированныйStatusBarX UINavigationController, после того как он отображает содержимое под строкой состояния.
  • По умолчанию предпочтительный UStavusCarStyle UINavigationController использует значение из UINav.navigationBar.barStyle. .Default = содержимое строки состояния черного цвета, .Black = содержимое строки состояния белого цвета.
  • Так что, если вы устанавливаете barTintColor в какой-то пользовательский цвет (которым вы, вероятно, являетесь), вам также нужно установить barStyle в .Black, чтобы получить содержимое строки состояния белого цвета. Я бы установил barStyle на черный перед установкой barTintColor, в случае, если barStyle переопределяет barTintColor.
  • Альтернатива заключается в том, что вы можете создавать подклассы UINavigationController, а не использовать стиль бара.
  • ОДНАКО, если вы подкласс UINavigationController, вы не получите никакого контроля над строкой состояния, если navigationBarHidden = true. Каким-то образом UIKit направляется непосредственно к дочернему UIViewController, не спрашивая UINavigationController в этой ситуации. Я бы подумал, что обязанность UINavigationController - спросить ребенка> пожимает плечами <.
  • И модально отображаемый UIViewController получает право голоса только в строке состояния, если modalPresentationStyle = .FullScreen.
  • Если у вас есть пользовательский контроллер модального представления в стиле презентации и вы действительно хотите, чтобы он управлял строкой состояния, вы можете установить modalPresentationCapturesStatusBarAppearance = true.

Почему яблоко не может просто следовать одному совету? Если это не сломано, не исправляйте это!
Jargen89

9

Чтобы скрыть строку состояния в iOS7, вам нужно 2 строки кода

  1. в приложении: (UIApplication *) приложение didFinishLaunchingWithOptions: (NSDictionary *) launchOptions write

     [[UIApplication sharedApplication] setStatusBarHidden:YES];
    
  2. в info.plist добавить это

     View-Controller Based Status Bar Appearance = NO
    

8

Для лучшего понимания добавьте несколько фотографий с комментариями:

Приложение перед любыми изменениями

введите описание изображения здесь

Найденный в вашей Project Navigatorпапке с именем Supporting Filesи нажмите на * .plist файл

введите описание изображения здесь

После того, как вы получите различные настройки вашего приложения, показанные. Вам нужно добавить 2 ключа UIStatusBarHiddenи UIViewControllerBasedStatusBarAppearance. Вы можете сделать это, просто нажав на кнопку +

введите описание изображения здесь

После нажатия + вы можете выбрать одну из клавиш - просто начните печатать.

Правильная версия:

введите описание изображения здесь

И, наконец, приложение после применения этих изменений:

введите описание изображения здесь

Также вы можете найти альтернативное решение здесь


8

В iOS10 все, что мне нужно было сделать, это переопределить переменную prefersStatusBarHiddenв моем RootViewController(Swift):

override var prefersStatusBarHidden: Bool {
    return true
}

7

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

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

Отлично. Я смог использовать это, чтобы скрыть строку состояния на контроллере представления, в котором он не был нужен, а затем показать его, когда пользователь вошел в систему.
LondonGuy

5

Чтобы скрыть строку состояния в iOS7:

Откройте ваш plist-файл, затем добавьте строку с названием «Просмотр внешнего вида строки состояния на основе контроллера» и установите для нее значение NO.


5

Вот версия Swift (до iOS9):

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)
}

Это также работает (iOS7 +):

override func prefersStatusBarHidden() -> Bool {
    return true
}

Вам также необходимо позвонить:

setNeedsStatusBarAppearanceUpdate()

в скажем viewDidLoad().

Обратите внимание, что если вы используете контроллер SplitView или другой containerконтроллер представления, вам также нужно, чтобы он возвращал ваш класс при его отправке childViewControllerForStatusBarHidden. Один из способов сделать это - иметь публичную слабую переменную, скажем statusController, и вернуть ее в этом переопределенном методе.


1
Верхний блок устарел в iOS8 - используйте ваш второй подход. И спасибо! Я отредактировал код, чтобы добавить еще один обязательный вызов.
Дэвид Х

5

iOS 9 и более поздних версий:

Поскольку statusBarHiddenметод был устаревшим с iOS9, вам нужно добавить два значения в plist, как показано ниже:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

или по интерфейсу пользователя Пожалуйста, обновите изображение ниже:

введите описание изображения здесь

Как statusBarHiddenэто Устаревшие из iOS9 :

@property (readwrite, nonatomic, getter = isStatusBarHidden) BOOL statusBarHidden NS_ DEPRECATED _IOS (2_0, 9_0 , "Использовать - [UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;


5

ИСПРАВЛЕННОЕ РЕШЕНИЕ ДЛЯ SWIFT 3+ (iOS 9, 10)

1- В info.plist указан ниже свойства

введите описание изображения здесь

2- Вставьте приведенный ниже код в корневой контроллер, чтобы

 private var isStatusBarHidden = true {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
        return isStatusBarHidden
    }

Можете позвонить isStatusBarHidden = trueи isStatusBarHidden = falseкуда хотите в hide/showстатус бар


4

Вы должны добавить это значение в plist: «Просмотреть внешний вид строки состояния на основе контроллера» и установить «NO».


4

Шаги для скрытия строки состояния в iOS
1. Откройте файл AppDelegate.m , добавьте application.statusBarHidden в методе didFinishLaunchingWithOptions

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    application.statusBarHidden = YES;
    return YES;
    }
  1. откройте info.plist и установите

View controller-based status bar appearance устанавливать NO


4

Swift 5

Используйте следующие шаги, чтобы скрыть строку состояния iOS:

  1. Открыть на Info.plist.
  2. Добавить новый ключ. Просмотреть внешний вид строки состояния контроллера и установить значение NO .
  3. Добавить новый ключ Строка состояния изначально скрыта и значение установлено в YES .
  4. Перекомпилируйте проект.
  5. Строка состояния теперь должна быть скрыта на телефоне iOS.

Скриншот окончательных настроек:

Окончательные настройки

Это работает на Xcode 10.2


2

От UIKit> UIApplication.h:

// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
@property(nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_AVAILABLE_IOS(3_2);

Так что следует установить View controller-based status bar appearanceна НЕТ


2

Чтобы ответить на вопрос Суситы : используйте setNeedsStatusBarAppearanceUpdate . Это вызовет prefersStatusBarHidden для обновления с желаемым состоянием строки состояния. Попробуй это:

    @property (nonatomic, getter=isHideStatusBar) BOOL hideStatusBar; // Give this a default value early

    - (BOOL)prefersStatusBarHidden {
        return self.isHideStatusBar;
    }

    - (void)someMethod {
    // triggered by an event or user action
    [self setHideStatusBar:YES];
    [self setNeedsStatusBarAppearanceUpdate];
    }

Если вы хотите снова увидеть строку состояния, установите для вашего свойства hideStatusBar (или как вы его называете) значение NO. Вызовите ПредпочитаемыйСтатусБар скрытый косвенным путем, сделав еще один вызов

[self setNeedsStatusBarAppearanceUpdate]

1

Обновление для Swift 3:

Обновите Info.plist следующей информацией:

View controller-based status bar appearance: NO

Затем в ViewController или в другом месте:

UIApplication.shared.isStatusBarHidden = true

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.