Як приховати рядок стану 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/…
Ben

Відповіді:


277

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

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


40
Для довідки, сировинний ключUIViewControllerBasedStatusBarAppearance
Вільям Денніс

1
@ Rajneesh071 Що мені потрібно зробити, якщо я хочу встановити перевагуStatusBarStyle для роботи, яка мені потрібна "View controller-based status bar appearance" set it to "YES".?
Бімава


з яким питанням ви стикаєтесь?
Rajneesh071

здається застарілим, зламає вашу програму
Бен

194

Додайте наступне до свого Info.plist:

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

Зображення


Чудово працює у Xcode 11.3, iOS 13
Wayne Henderson

113

Додайте наступний рядок у viewdidload

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

і додати новий метод

  - (BOOL)prefersStatusBarHidden {
          return YES;
  }

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

це працює для мене


Спасибі за цей, який працює для мене, але мені також потрібно додати нижче рядка в плісті. "Перегляд вигляду рядка стану на основі контролера" = NO i, e Додати наступний рядок у viewdidload [[UIApplication sharedApplication] setStatusBarHidden: YES withAnimation: UIStatusBarAnimationFade]; і додайте новий метод - (BOOL) віддає перевагуStatusBarHidden {поверніть ТАК; } Додати "Переглянути зовнішній вигляд рядка стану на основі контролера" = НІ у файлі Plist
піщаний

prefersStatusBarHiddenце те, що зробило для мене фокус (чи з цим рішенням інших подібних)
Абдо

34

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

Status bar is initially hidden = YES

View controller-based status bar appearance = NO

тепер рядок стану буде приховано


8
Сировими ключами будуть UIStatusBarHidden та UIViewControllerBasedStatusBarAppearance
leolobato

27

Спробуйте цей простий метод:


Завдання-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];
}

Швидкий:

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, вони досить чудові.
VedTopkar

Не забувайте [super viewWillAppear:animated]і[super viewWillDisappear:animated]
СамБ

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
  • У вашому info.plist застаріле наявність UIViewControllerBasedStatusBarAppearance = НІ
  • Таким чином, ми повинні використовувати перевагуStatusBarX у всіх наших контролерах перегляду

Але це стає цікавіше, коли в ньому бере участь UINavigationController:

  • Якщо navigationBarHidden = вірно, виклику дочірнього UIViewController є кращимStatusBarX, оскільки дитина відображає вміст у рядку стану.
  • Якщо НавігаціяBarHidden = false, викликається кращий UINavigationControllerStausBarX, адже він відображає вміст у рядку стану.
  • За замовчуванням UINavigationController вважається кращимStatusBarStyle, використовуючи значення UINav.navigationBar.barStyle. .Default = вміст чорної смуги стану, .Black = вміст білого рядка стану
  • Тож якщо ви встановлюєте barTintColor для якогось спеціального кольору (який ви, швидше за все, є), вам також потрібно встановити barStyle на .Black, щоб отримати вміст білого рядка стану. Я б встановив barStyle чорним кольором перед встановленням barTintColor, у випадку, якщо barStyle замінить barTintColor.
  • Альтернативою є те, що ви можете підкласифікувати UINavigationController, а не стикатися зі стилем бар.
  • ЗАРАЗ, якщо ви підклас UINavigationController, ви не маєте контролю над рядком стану, якщо navigationBarHidden = true. Якимсь чином UIKit переходить безпосередньо до дочірнього UIViewController, не запитуючи UINavigationController у цій ситуації. Я б подумав, що відповідальність за прохання дитини> потискати плечі <повинна бути відповідальністю UINavigationControlller.
  • І модально відображається UIViewController може отримати слово лише у рядку стану, якщо modalPresentationStyle = .FullScreen.
  • Якщо у вас є власний контролер модального перегляду в стилі презентації, і ви дійсно хочете, щоб він контролював рядок стану, ви можете встановити modalPresentationCapturesStatusBarAppearance = true.

Чому Apple не може просто дотримуватися однієї поради? Якщо вона не зламана, не виправляйте її!
Jargen89

9

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

  1. у застосунку: (UIApplication *) додаток didFinishLaunchingWithOptions: (NSDictionary *) writeOptions 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 все, що мені потрібно було зробити, це перекрити prefersStatusBarHiddenvar у моєму RootViewController(Swift):

override var prefersStatusBarHidden: Bool {
    return true
}

7

Спробуйте це;

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

Чудово. Я був в змозі використати це , щоб приховати рядок стану на контролері уявлення не було необхідно в той Unhide ній після того , як користувач увійшов в систему .
LondonGuy

5

Щоб приховати рядок стану в iOS7:

Відкрийте свій список-список, а потім додайте рядок під назвою "Перегляд зовнішнього вигляду рядка стану на основі контролера" та встановіть його значення 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, вам потрібно додати два значення в плісті, як показано нижче:

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

або за допомогою інтерфейсу користувача Будь ласка, оновіть нижче зображення:

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

Як statusBarHiddenце Застарілі з iOS9 :

@property (readwrite, неатомічний, getter = isStatusBarHidden) Status BOOLBarHidden NS_ DEPRECATED _IOS (2_0, 9_0 , "Use - [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

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


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

Швидкий 5

Щоб приховати рядок стану iOS, виконайте такі дії:

  1. Відкрити в Info.plist.
  2. Додайте новий ключ Вигляд рядка стану на основі контролера та значення, встановлене НІ .
  3. Додати новий ключ Рядок стану спочатку приховано, а значення встановлено на ТАК .
  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 . Це дозволить зателефонувати преферуStatusBarHidden, щоб оновити бажаний стан рядка стану. Спробуйте це:

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

Якщо ви хочете побачити рядок стану ще раз, встановіть для вашого ресурсу hidStatusBar (або як ви його називаєте) на "НІ". Викличте перевагуStatusBarHidden опосередковано, зробивши інший дзвінок на

[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.