Не вдається приховати рядок стану в 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?
bhavik

Відповіді:


558

у файлі плістів додатків додайте рядок, називайте його "Перегляд зовнішнього вигляду на основі контролера" та встановіть його "НІ"

Зауважте, що це просто не працює, якщо ви використовуєте UIImagePickerController у додатку.

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

An example adding View Base Controller to your Info settings in 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
Для всіх, хто шукає, це такий спосіб зробити, якщо ви хочете динамічно видалити рядок стану в певних видах перегляду. Цей метод працює незалежно від того, що ви встановили "Перегляд зовнішнього вигляду на основі контролера" у своєму списку!
Містер T

2
+1 b / c Я шукаю можливість динамічно показувати / приховувати рядок стану. Однак спосіб налаштування списку P (див. Повідомлення від @Satgi вище) є найкращим способом показу / приховування рядка стану в усьому світі.
JonnyB

Якщо у вас десь є галерея фотографій, ви, як правило, хочете лише там заховати елементи керування, і ви також можете їх увімкнути / вимкнути. Це для мене не працює, функція навіть не викликається. У мене там же
кращийStatusBarStyle

4
@ Mr.T В iOS 8, здається, це вже не так. Якщо ви встановили зовнішній вигляд рядка стану на основі контролера перегляду значення "НІ" та повернули значення "істина" з prefersStatusBarHiddenцього контролера, це не буде працювати. Рядок стану все ще з’являється.
Ісуру

1
@Isuru, чому ти встановив "НІ"? Якщо ви встановите YES, він попросить кожного контролера перегляду в іншому випадку, звичайно, це не буде.
invoodoo

84

До списку додайте наступні властивості.

-> Status bar is initially hidden= ТАК

-> View controller-based status bar appearance= НІ

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


Так, це працювало і для мене. Не встановлюючи параметр "Рядок стану спочатку приховано", ТАК не працює так, як очікувалося. Дякую.
AndrewShmig

53

Щоб приховати рядок стану в одному вікні, слід використовувати:

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

Спочатку це не спрацювало для мене, а потім в документації цього методу з'явилася письма: // Налаштування статусуBarHidden нічого не робить, якщо ваша програма використовує стандартну систему рядка стану на основі UIViewController.

Це потрібно зробити у файлі plist, додавши View controller-based status bar appearanceнабір ключа NO. І тоді це спрацювало.


16

Для того, щоб використовувати застарілий метод UIApplication для приховування / показу рядка стану, ваш додаток повинен встановити значення плістів для iOS 7:

View-Controller Based Status Bar Appearance = NO

Це значення за замовчуванням встановлено YES. Якщо змінити його на "НІ", ви можете використовувати застарілі методи. Якщо ви задасте значення "ТАК", ви все одно можете приховати рядок стану, але це має бути перекрито підкласом контролера перегляду у вашому додатку: prefersStatusBarHiddenщоб повернути ТАК.

Щоразу, коли вашій програмі потрібна зміна вигляду або видимості рядка стану, а для зовнішнього вигляду на основі контролера перегляду встановлено значення ТАК, ваш зовнішній контролер подання повинен викликати:

setNeedsStatusBarAppearanceUpdateAnimation


Мені довелося подати заявку в користувальницькі властивості 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
Просто для того, щоб очистити це, якщо ви [application setStatusBarHidden:YES];application.statusBarHidden = YES;
поміщаєте

може бути помилка друку у відповіді вище. "Зовнішній вигляд рядка стану на основі контролера перегляду = НІ" не працював для мене, але "Перегляд вигляду рядка стану на основі контролера = НІ" працював.
тмр

11

Для цієї проблеми запропоновано дуже багато комбінацій, але проблема полягає в тому, що iOS 6 та 7 використовують різні методи, щоб приховати рядок стану. Мені ніколи не вдалося встановити налаштування плістів, щоб увімкнути поведінку стилю iOS6 на iOS 7, але якщо ви створюєте додаток для підтримки iOS 6+, вам потрібно скористатися одразу трьома методами, щоб певний контролер перегляду приховував статус бар:

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

Це має працювати незалежно від ваших налаштувань списку.


7

Я повинен був зробити обидві зміни нижче, щоб приховати рядок стану:

Додайте цей код до контролера перегляду, де ви хочете приховати рядок стану:

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

Додайте це до файлу .plist (перейдіть до "інформації" у налаштуваннях програми)

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, що не fakey рішення, великий
Fattie

3
  1. До списку додайте ----

    Перегляд вигляду рядка стану на основі контролера --- НІ

  2. У кожному поданні пишуть контролер

    - (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.І встановіть, перегляньте зовнішній вигляд рядка стану на основі контролера: булевий НІ

Сподіваюсь, я вирішив питання рядка стану .....


3

Для iOS 7 в одному огляді використовуйте метод viewWillappear:

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

Для відображення рядка стану використовуйте:

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


2

У файлі списку інформації "Додати інформацію" Додати рядок для наступного ресурсу

Назва властивості: Перегляд зовнішнього вигляду рядка стану на основі контролера

Значення: НІ


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 = ТАК. Тоді мені довелося помістити (BOOL) prefersStatusBarHidden метод (повернення ТАК) в один 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;
}

Питання прямо зазначає, що такий підхід не працює. Будь ласка, уважно прочитайте питання, перш ніж відповісти.
Борис Веребський

Поки зовнішній вигляд рядка стану на основі контролера перегляду встановлено на "НІ", це найчистіший підхід.
Еван Іше

-7

Я не впевнений, чому ви "не можете увійти на Форуми розробників Apple", але (не порушуючи NDA), ви також можете приховати свій статусBar через Xcode. Це загальна настройка цілі програми.введіть тут опис зображення


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