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

267

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

Не работает:

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

Не работает:

[UIApplication sharedApplication].statusBarHidden = YES;

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

Мелих Бююкбайрам
источник
15
Неверно, мой ответ касался XCode, и это было показано широкой публике. Слишком обобщенно говорить «если вы ответите на это, это нарушение NDA» .. пусть разработчики сами решат это ;-)
Джейк
возможный дубликат строки состояния не исчезнет
ekhumoro
как скрыть строку состояния программно определенного 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

satgi
источник
3
Удивительный! Я трачу часы на это! Спасибо!
Идан
12
Для справки вызывается необработанное значение, сохраненное в фактическом файле Info.plist UIViewControllerBasedStatusBarAppearance.
Адам Розенфилд
55
Единственная проблема с этим подходом состоит в том, что если вы используете UIImagePickerController для выбора изображений, это заставит строку состояния появляться снова. Единственный надежный способ предотвратить это - реализовать метод prefersStatusBarHidden в каждом из ваших контроллеров представления и сбросить UIViewControllerBasedStatusBarAppearance. Плист настройки, чтобы быть правдой.
Джейсон Фюрстенберг
5
Я действительно не знаю, почему Apple изменила это! Спасибо :)
Мохамед Амин
18
Вы также должны установить Status bar is initially hiddenв YES .
Зорайр
277

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

- (BOOL)prefersStatusBarHidden {
    return YES;
}
invoodoo
источник
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= НЕТ

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

user1179912
источник
Да, это сработало и для меня. Без настройки «Строка состояния изначально скрыта» опция ДА не работает должным образом. Спасибо.
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

jaredsinclair
источник
Мне пришлось подать заявку в 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.

SaltyNuts
источник
7

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

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

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

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

View controller-based status bar appearance --- NO

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

[[UIApplication sharedApplication] setStatusBarHidden:YES];
Петр Y
источник
6

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

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

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

Sid
источник
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/>
bartburkhardt
источник
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 и выше для приложения

Maulik
источник
3

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

[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
darkheartfelt
источник
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];
Оскар Кастельон
источник
3
-(BOOL)prefersStatusBarHidden
{
    return YES;
}
буревестник
источник
2

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

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

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

user842553
источник
1

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

- (BOOL)prefersStatusBarHidden
    {
        return YES;
    }
Bhoopi
источник
1

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

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

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

Для 2019 года ...

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

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

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

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

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

Fattie
источник
0

Для Swift 2.0+ IOS 9

override func prefersStatusBarHidden() -> Bool {
return true
}
Иршад Куреши
источник
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. Это общая настройка цели вашего приложения.введите описание изображения здесь

Джейк
источник
Нет, работает как шарм. форумы были на некоторое время.
Джейк