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

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

Не работает:

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

Не работает:

[UIApplication sharedApplication].statusBarHidden = YES;

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

25 ответов

Решение

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

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

от http://www.openfl.org/developer/forums/general-discussion/iphone-5ios-7-cant-hide-status-bar/, раствор mgiroux

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

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

- (BOOL)prefersStatusBarHidden {
    return YES;
}

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

-> Status bar is initially hidden = ДА

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

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

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

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

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

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

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

View-Controller Based Status Bar Appearance = NO

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

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

setNeedsStatusBarAppearanceUpdateAnimation

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

  1. inapplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions записывать

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

    View-Controller Based Status Bar Appearance = NO
    

Для этой проблемы предлагается так много комбинаций, но проблема в том, что 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.

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

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

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

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

View controller-based status bar appearance --- NO

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

[[UIApplication sharedApplication] setStatusBarHidden:YES];

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

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

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

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

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

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

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

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

Самый простой метод, который я нашел для сокрытия строки состояния во всем приложении, это создание 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

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

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

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

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

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

[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
  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 и выше для приложения

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

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

2.И установить, просмотреть внешний вид строки состояния контроллера: логическое НЕТ

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

-(BOOL)prefersStatusBarHidden { return YES; }

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

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

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

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

- (BOOL)prefersStatusBarHidden
    {
        return YES;
    }

На 2019 год...

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

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

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

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

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

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

Вы можете проверить этот код, под https://cocoapods.org/pods/UIViewController+ODStatusBar

Для Swift 2.0+ IOS 9

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

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

- (BOOL)prefersStatusBarHidden {
    return YES;
}

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

  • задавать View controller-based status bar appearanceвNO в.plist и в application: didFinishLaunchingWithOptions: задавать:[application setStatusBarHidden:YES];

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

ИЛИ ЖЕ

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

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

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

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

Другие вопросы по тегам