Подтвердить что ты не робот

Как скрыть строку состояния одного контроллера представления в iOS 9?

В ViewController, который я представил модально, я сделал это:

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

Это работало, но оно больше не работает. Какой лучший способ скрыть строку состояния только для этого контроллера представления?

4b9b3361

Ответ 1

Для Swift 3 и Swift 4 это изменилось на переопределение переменной как это:

override var prefersStatusBarHidden: Bool {
  return true
}

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

setNeedsStatusBarAppearanceUpdate()

Пожалуйста, обратитесь к документации.

Ответ 2

Для Swift 3 и Swift 4.2, когда вид собирается появиться

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    UIApplication.shared.isStatusBarHidden = true
}

когда посмотреть goint в Dissapear

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    UIApplication.shared.isStatusBarHidden = false
}

Возможно, вам нужно установить его в вашем info.plist, следующую строку:

View controller-based status bar appearance = NO

enter image description here

Ответ 3

В iOS 9, Xcode 7, Swift 2.0 он возвращается к тому, как это было ранее.

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

Фактически Xcode скажет вам, что

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None) 

устарел и что вы должны использовать метод prefersStatusBarHidden.

Ответ 4

В вашем UIViewController:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIApplication.shared.isStatusBarHidden = true
}

 override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    //It will show the status bar again after dismiss
    UIApplication.shared.isStatusBarHidden = false
}

override var prefersStatusBarHidden: Bool {
    return true
}

Ответ 5

Для Swift 3,

override var prefersStatusBarHidden: Bool{
        return true
    }

и добавьте viewDidLoad()

self.modalPresentationCapturesStatusBarAppearance = true

Ответ 6

Вы можете добиться этого, просто переопределив свойство prefersStatusBarHidden в вашем ViewController, как показано ниже:

override var prefersStatusBarHidden: Bool {
   return true
}

Screenshot added

Это работает для Swift 3/4.

Ответ 7

Для тех, кто все еще борется, ниже работает для iOS9.

Вы обновляете функцию root preferController prefersStatusBarHidden, вызывая ее из вашего отдельного просмотра/просмотра внуков/внуков. Это работает там, где вы добавляете childViewControllers прямо в ваш rootViewController.

Вам не нужно ничего устанавливать в файле info.plist, но установка параметра 'statusBarIsInitiallyHidden' работает независимо от ниже.

Сначала в корневом контроллере root добавьте следующее:

-(void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateStatusBarAppearance:) name:@"kStatusBarAppearance" object:nil]; 
}
-(void)updateStatusBarAppearance:(NSNotification *)n {
    statusBarIsHidden = [n.object boolValue];
    [self setNeedsStatusBarAppearanceUpdate];
}
-(UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent; //optional
}
-(BOOL)prefersStatusBarHidden{
    return statusBarIsHidden;
}

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

-(void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:true]];
}
-(void)popSelf {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:false]];
}

Ответ 8

Вы можете использовать

override public func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    // hide status bar
    dispatch_async(dispatch_get_main_queue(), {
        if let window = UIApplication.sharedApplication().keyWindow {
            window.windowLevel = UIWindowLevelStatusBar + 1
        }
    })

}

override public func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    // Show status bar
    dispatch_async(dispatch_get_main_queue(), {
        if let window = UIApplication.sharedApplication().keyWindow {
            window.windowLevel = UIWindowLevelNormal
        }
    })

}

Ответ 9

Используйте этот код:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    UIApplication.shared.isStatusBarHidden = true
}

если этот код не работает, вам нужно добавить этот ключ в файл info.plist

Просмотр состояния строки состояния контроллера - NO

Ответ 10

Полное решение для iOS 11 и Swift 4, предоставляющее вам полный контроль над вашей программой.

var statusBarHidden : Bool?

override var prefersStatusBarHidden: Bool {
    get {
        if let status = statusBarHidden { return status } else { return false }
    }
    set(status) {
        statusBarHidden = status
        setNeedsStatusBarAppearanceUpdate()
    }
}

Теперь вы можете просто показать или скрыть строку состояния, установив свойство из своего кода. Я проверил это так:

@IBAction func Show(_ sender: Any) {
    prefersStatusBarHidden = false
}

@IBAction func Hide(_ sender: Any) {
    prefersStatusBarHidden = true
}

Работает как шарм.

Ответ 11

Я использую Xcode Version 9.2/Swift 3.2/iOS 11

Я получил этот ответ от BADCloud, хотя я не уверен, почему он не работает для него.

Во всяком случае, это работает для меня для конкретного контроллера представления.

Разница между этим ответом и другими ответами здесь заключается в том, что в моем info.plist когда у меня изначально был вид строки состояния View на основе контроллера - НЕТ с двумя методами statusBar ниже, он не работал, но когда я изменил его на Да, работал с ними обоими.

В изменении info.plist: просмотреть внешний вид строки состояния на основе контроллера - ДА enter image description here

В контроллере представления вы хотите, чтобы это изменилось в добавлении:

override func viewDidLoad() {
        super.viewDidLoad()

        // add this in ViewDidLoad
        setNeedsStatusBarAppearanceUpdate()
}

// add this underneath ViewDidLoad
override var prefersStatusBarHidden: Bool {
  return true
}

Ответ 12

Когда все остальное терпит неудачу (как это сделало для меня)

Редактирование.plist не требуется. И AppStore одобрит это

(UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow)?.isHidden = false

Ответ 13

Скройте панель состояния плавно, просто используя UIAnimation и сохраненное свойство.

Свифт 3+

  var statusBarState = false
    override var prefersStatusBarHidden: Bool{
        return statusBarState
    }

А потом в поле зрения WillAppear

  override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        statusBarState = true
        UIView.animate(withDuration: 0.30) {
            self.setNeedsStatusBarAppearanceUpdate()
        }
    }

enter image description here

Ответ 14

Поздний ответ, но если вам нужно альтернативное решение, вы можете использовать это:

public func ShowStatusBar() {

    let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
    UIView.animate(withDuration: 0.3) {
        statusBarWindow?.alpha = 1
    }
}

public func HideStatusBar() {

    let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
    UIView.animate(withDuration: 0.3) {
        statusBarWindow?.alpha = 0
    }
}

Ответ 15

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None) 

и когда вы хотите вернуть его в отдельный VC:

UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: .None)