Не удается скрыть строку состояния в iOS7


267

Я только что обновил свой iPhone 5 iOS 7 до четырех бета-версии. Теперь, когда я запускаю свое приложение из Xcode 5 на этом iPhone, строка состояния не скрывается, хотя и должна.

Не работает:

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

Не работает:

[UIApplication sharedApplication].statusBarHidden = YES;

Не удается войти на форумы разработчиков Apple


15
Неверно, мой ответ касался XCode, и это было показано широкой публике. Слишком обобщенно говорить «если вы ответите на это, это нарушение NDA» .. пусть разработчики сами решат это ;-)
Джейк


как скрыть строку состояния программно определенного ViewController?
Бхавик

Ответы:


558

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

Обратите внимание, что это просто не работает, если вы используете UIImagePickerController в приложении.

с http://www.openfl.org/developer/forums/general-discussion/iphone-5ios-7-cant-hide-status-bar/ , решение mgiroux

Пример добавления View Base Controller в ваши настройки Info в Xcode


3
Удивительный! Я трачу часы на это! Спасибо!
Идан

12
Для справки вызывается необработанное значение, сохраненное в фактическом файле Info.plist UIViewControllerBasedStatusBarAppearance.
Адам Розенфилд

55
Единственная проблема с этим подходом состоит в том, что если вы используете UIImagePickerController для выбора изображений, это заставит строку состояния появляться снова. Единственный надежный способ предотвратить это - реализовать метод prefersStatusBarHidden в каждом из ваших контроллеров представления и сбросить UIViewControllerBasedStatusBarAppearance. Плист настройки, чтобы быть правдой.
Джейсон Фюрстенберг

5
Я действительно не знаю, почему Apple изменила это! Спасибо :)
Мохамед Амин

18
Вы также должны установить Status bar is initially hiddenв YES .
Зорайр

277

Добавьте метод в вашем контроллере представления.

- (BOOL)prefersStatusBarHidden {
    return YES;
}

35
Для всех тех, кто ищет, это способ сделать это, если вы хотите динамически удалять строку состояния в определенных представлениях. Этот метод работает независимо от того, что вы установили для параметра «Просмотр внешнего вида строки состояния на основе контроллера» в своем списке!
г-н Т

2
+1 б / к Я ищу возможность динамически показывать / скрывать строку состояния. Однако метод настройки P-списка (см. Сообщение @Satgi выше) - лучший способ показать / скрыть строку состояния в глобальном масштабе.
JonnyB

Если у вас есть фотогалерея где-то, вы обычно хотите скрыть элементы управления только там, и вы также можете включить / выключить ее. Это не работает для меня, функция даже не вызывается. У меня там же предпочтительный
StatusBarStyle

4
@ Mr.T В iOS 8, похоже, уже нет. Если вы установили внешний вид строки состояния на основе контроллера представления на NO и вернули true из prefersStatusBarHiddenконтроллера представления, это не будет работать. Строка состояния все еще появляется.
Исуру

1
@Isuru почему ты выбрал НЕТ? Если вы установите YES, он будет запрашивать каждый контроллер представления в другом случае, конечно, это не так.
invoodoo

84

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

-> Status bar is initially hidden= ДА

-> View controller-based status bar appearance= НЕТ

Добавьте оба - теперь строка состояния исчезнет.


Да, это сработало и для меня. Без настройки «Строка состояния изначально скрыта» опция ДА не работает должным образом. Спасибо.
AndrewShmig

53

Чтобы скрыть строку состояния в одном представлении, вы должны использовать:

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

Сначала это не сработало для меня, а затем в документации этого метода было замечено следующее: // Установка statusBarHidden ничего не делает, если ваше приложение использует стандартную систему строки состояния на основе UIViewController.

Это должно быть сделано в файле plist, добавив ключ View controller-based status bar appearanceк NO. И тогда это сработало.


16

Чтобы использовать устаревший метод UIApplication для скрытия / отображения строки состояния, ваше приложение должно установить значение plist для iOS 7:

View-Controller Based Status Bar Appearance = NO

Это значение по умолчанию установлено в YES. Если вы измените его на NO, вы можете использовать устаревшие методы. Если вы оставите для него значение YES, вы все равно сможете скрыть строку состояния, но каждый подкласс контроллера представления в вашем приложении должен переопределять: prefersStatusBarHiddenвозвращать YES.

Каждый раз, когда вашему приложению требуется изменить вид строки состояния или видимость, а внешний вид строки состояния на основе View-Controller устанавливается на YES, вашему внешнему контроллеру представления необходимо вызвать:

setNeedsStatusBarAppearanceUpdateAnimation


Мне пришлось подать заявку в Custom iOS Target Properties, потому что в общем списке не сработало
xarly

16

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

  1. неприменение: (UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsнаписать

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

    View-Controller Based Status Bar Appearance = NO

2
Просто чтобы очистить это, если вы помещаете это в didFinishLaunching, вы можете просто написать [application setStatusBarHidden:YES];илиapplication.statusBarHidden = YES;
joel.d

там может быть опечатка в ответе выше. «Вид строки состояния View-Controller = НЕТ» у меня не работал, но работал вид строки состояния View-Control = НЕТ.
tmr

11

Для этой проблемы предлагается так много комбинаций, но проблема в том, что iOS 6 и 7 используют разные методы, чтобы скрыть строку состояния. У меня никогда не было успешной установки параметров plist для включения поведения в стиле iOS6 на iOS 7, но если вы создаете свое приложение для поддержки iOS 6+, вам нужно использовать сразу 3 метода, чтобы гарантировать, что конкретный контроллер представления скрывает статус бар:

// for ios 7 
- (BOOL)prefersStatusBarHidden{
    return YES;
}

// for ios 6
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    // explicitly set the bar to show or it will remain hidden for other view controllers
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
}

Это должно работать независимо от ваших настроек plist.


7

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

Добавьте этот код в контроллер представления, где вы хотите скрыть строку состояния:

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

Добавьте это в свой файл .plist (перейдите к «info» в настройках вашего приложения)

View controller-based status bar appearance --- NO

Затем вы можете вызвать эту строку, чтобы скрыть строку состояния:

[[UIApplication sharedApplication] setStatusBarHidden:YES];

6

Просто добавьте эти 2 строки в файл info.plist. Это исправит и iOS7, и более старую версию.

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

Перейдите к проекту и выберите «Цели» -> «Общие» и установите флажок «Стиль строки состояния ... Скрыть во время запуска приложения». Это будет работать


6

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

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

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

4

Единственное, что сработало для меня, это добавить следующее в свой список

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

4

Самый простой метод, который я нашел для сокрытия строки состояния во всем приложении, это создание category включение UIViewControllerи переопределение prefersStatusBarHidden. Таким образом, вам не нужно писать этот метод в каждом контроллере представления.

UIViewController + HideStatusBar.h

#import <UIKit/UIKit.h>

@interface UIViewController (HideStatusBar)

@end

UIViewController + HideStatusBar.m

#import "UIViewController+HideStatusBar.h"

@implementation UIViewController (HideStatusBar)

//Pragma Marks suppress compiler warning in LLVM. 
//Technically, you shouldn't override methods by using a category, 
//but I feel that in this case it won't hurt so long as you truly 
//want every view controller to hide the status bar. 
//Other opinions on this are definitely welcome

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

#pragma clang diagnostic pop


@end

лучшее реальное, iOS7, ненастоящее решение, отлично
Fattie

3
  1. В плист добавьте ----

    Просмотреть внешний вид строки состояния на основе контроллера --- НЕТ

  2. В каждом viewController напишите

    - (void) viewDidLayoutSubviews
    {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = 20.0;
        viewBounds.origin.y = -topBarOffset;
        self.view.bounds = viewBounds;
    
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];//for status bar style
    }

Для проблемы строки состояния в iOS 7, но цель должна быть 5.1 и выше для приложения


3

Многие ответы в этой теме работают, но я понимаю, что если вы пытаетесь сделать что-то динамическое, вам в конце концов придется позвонить:

[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];

3

Шаги для скрытия строки состояния в iOS 7:

1. Перейдите в файл info.plist вашего приложения.

2.И установить, просмотреть внешний вид строки состояния контроллера: Boolean NO

Надеюсь, я решил проблему в строке состояния .....


3

Для iOS 7 в единственном представлении используйте в методе viewWillappear:

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

Для отображения строки состояния используйте:

[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:NO];


2

В Info Plist file Добавить строку для следующего свойства

Имя свойства: просмотр внешнего вида строки состояния контроллера

Значение: НЕТ


1

Попробуйте добавить следующий метод в корневой контроллер вашего приложения:

- (BOOL)prefersStatusBarHidden
    {
        return YES;
    }

1

Я попробовал все эти варианты, опубликованные здесь, на моем проекте, и они не будут работать. Я думал, что это может быть связано с тем, что я обновил свое, Xcodeа затем и приложение до iOS 7, и некоторые настройки где-то испортились. Я решил создать для него совершенно новый проект, и после простой установки: « Status bar is initially hidden = YES» и « View controller-based status bar appearance = NO», как было сказано многими другими, он работал правильно (то есть без строки состояния).

Поэтому мой совет, если вы работаете над проектом, который был обновлен до iOS 7 со старой версии и перепробовал все остальные варианты, это создать новый проект.


Я использовал эту же технику, чтобы первоначально подтвердить, что я могу скрыть строку состояния глобально для каждого экрана, но, поскольку мое приложение довольно «ориентировано на время», я хотел отображение времени для большинства экранов. Это только один экран, который я хотел исключить по разным причинам. В итоге я использовал противоположные вам параметры: изначально скрытый = NO & VC-отображение строки состояния = YES. Затем мне пришлось поместить метод (BOOL) prefersStatusBarHidden (возвращающий YES) в тот VC, где я хотел его скрыть. Работает красиво. Я должен добавить, что мое приложение доступно только для iOS7 по другим причинам.
bobsmells

1

Для 2019 года ...

Чтобы сделать приложение без строк состояния,

Нажмите info.plist, щелкните правой кнопкой мыши «Добавить строку».

Добавьте эти два с этими настройками:

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

Это все, что нужно сделать.




0

Чтобы скрыть строку состояния для определенного viewController

- (BOOL)prefersStatusBarHidden {
    return YES;
}

Для настройки строки состояния, скрытой для приложения:

  • набор View controller-based status bar appearanceдля NOв .plist и в application: didFinishLaunchingWithOptions:комплекте: [application setStatusBarHidden:YES];

    Примечание: setStatusBarHidden: устарело

ИЛИ

  • в настройках проекта -> вкладка "Общие" -> информация о развертывании

    Проверьте Hide Status barкоробку.


-1
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
application.statusBarHidden = YES;
return YES;
}

Вопрос явно упоминает, что этот подход не работает. Пожалуйста, внимательно прочитайте вопрос, прежде чем отвечать.
Борис Веребский

Пока внешний вид строки состояния на основе контроллера установлен на NO, это самый чистый подход.
Эван Иш

-7

Я не уверен, почему вы «не можете войти на форумы разработчиков Apple», но (не нарушая NDA) вы также можете скрыть свой statusBar через XCode. Это общая настройка цели вашего приложения.введите описание изображения здесь


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