Ios 隐藏状态栏swift 4

Ios 隐藏状态栏swift 4,ios,swift4,Ios,Swift4,我试图在我的一个UIViewController(Swift 4)中隐藏状态栏 首先,我在Info.plist中将基于视图控制器的状态栏外观设置为YES 我覆盖了控制器中的prefersStatusBarHidden属性: 在viewDidLoad()中,我添加了setNeedsStatusBarAppearanceUpdate()函数来强制读取prefersStatusBarHidden属性 在所有这些之后,我仍然可以看到UIViewController上的状态栏 有人能帮我吗 尝

我试图在我的一个UIViewController(Swift 4)中隐藏状态栏

  • 首先,我在
    Info.plist
    中将基于视图控制器的状态栏外观设置为YES

  • 我覆盖了控制器中的
    prefersStatusBarHidden
    属性:



  • viewDidLoad()
    中,我添加了
    setNeedsStatusBarAppearanceUpdate()
    函数来强制读取
    prefersStatusBarHidden
    属性
在所有这些之后,我仍然可以看到
UIViewController
上的状态栏


有人能帮我吗

尝试在项目设置的常规部分下选中隐藏状态栏


只需添加以下代码,即可在任何或所有视图控制器中隐藏状态栏:

override var prefersStatusBarHidden: Bool {
     return true
   }
默认情况下,任何包含该代码的视图控制器都将隐藏状态栏


如果要设置状态栏的输入或输出动画,只需在视图控制器上调用SetNeedssStatusBarAppearanceUpdate(),这将强制再次读取prefersStatusBarHidden,此时可以返回不同的值。如果您愿意,您对setNeedsStatusBarAppearanceUpdate()的调用实际上可以位于动画块内,这会导致状态栏以平滑的方式隐藏或显示。

这些对我来说都不起作用,无论是在iOS 11中处理已转换的项目。这就是我所做的。我在AppDelegate中添加了此代码

func application(_ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool
{
    application.isIdleTimerDisabled = true
    application.isStatusBarHidden = true
    return true
}
尝试将Info.plist中的“查看基于控制器的状态栏外观”标志设置为“是”。这将强制应用程序在每个视图控制器上调用
prefersStatusBarHidden:Bool
属性

使用以下代码
UIApplication.shared.isStatusBarHidden=true

这是我发现的唯一一个在iOS11中工作的东西。 您可以在
didfishlaunchingwithoptions
中写入,也可以在
BaseViewController

享受。

您可能已经找到了自己的解决方案,但我是这样做的:

override func viewWillAppear(_ animated: Bool) {
    // Sets the status bar to hidden when the view has finished appearing
    let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
    statusBar.isHidden = true
}

override func viewWillDisappear(_ animated: Bool) {
    // Sets the status bar to visible when the view is about to disappear
    let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
    statusBar.isHidden = false
}

如果以模式显示视图控制器,请尝试

viewController.modalPresentationCapturesStatusBarAppearance = true

尽管有些实现更干净,例如:

UIApplication.shared.isStatusBarHidden=true

在过渡期间会出现一些奇怪的剪辑动画。虽然更详细,但我更喜欢@machturl的解决方案:

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        if let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as? UIView{
        statusBar.isHidden = true
        }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
    statusBar.isHidden = false
}

试试看,对我来说很有用。

正如您所说,您正在使用UINavigationController导航到自定义视图控制器。我想您已经将自定义视图控制器设置为UINavigationController的根视图。在这种情况下,在自定义视图控制器中重写var PreferssStatusBarHidden将不起作用,但您必须对UINavigation控制器进行子类化,并重写其中的属性,如下所示:-

class CustomNavigationController: UINavigationController {

    override var prefersStatusBarHidden: Bool {
        return true
    }

}

只需将“顶部空间更改为”将您的视图从安全区域限制到Superview。它会将您的视图拖到状态栏下,这样就不需要隐藏它了]

我发现我的视图控制器中没有调用
prefersStatusBarHidden
,因为我使用的是自定义容器视图,我需要转发状态栏隐藏子视图控制器的责任。实现
var childForStatusBarHidden:UIViewController?{return childViewController}
在容器视图控制器中修复了if for me。

如果容器视图控制器是子视图控制器,则需要在容器视图控制器中写入代码

     override var prefersStatusBarHidden: Bool {
      return true
     }
将此添加到您的info.plist

UIStatusBarHidden

当您试图重载UINavigationStack中的ViewController的状态栏属性时-您需要在下面进行扩展

extension UINavigationController {
  override open var childForStatusBarStyle: UIViewController? {
    return self.topViewController
  }
}

然后,您的重载属性将变为活动状态

我正在搜索它,对我有效的是

Swift 5

override var prefersStatusBarHidden: Bool {
  return true
 }

也许如果你添加一些代码,这将有助于回答这个问题@Anbu.Karthik你链接的答案是OP已经做过的。我已经尝试了@Anbu.Karthik评论中提到的所有内容。你在使用UIPageViewController或任何其他视图层次结构吗?谢谢你的回答,但我不需要隐藏整个应用程序的状态栏,只需隐藏一个自定义UIViewControllert。此设置只会在最初隐藏状态栏,并有助于确保状态栏在许多情况下都是隐藏的。我尝试了所有这些,甚至在viewDidLoad()中UIApplication.shared.isStatusBarHidden=true,但状态栏仍然存在…我阅读了swift 4更改日志,没有任何关于更改首选项StatusBarHidden的内容..我在swift 4项目上所做的只是添加了上面的覆盖,其他什么都没有,它成功了。不需要更改Info.plist文件,也不需要调用setNeedsStatusBarAppearanceUpdate()对我有效。我没碰那根绳子。只需在UIViewController子类中复制并粘贴上面的代码。这是一些危险的代码。。。如果苹果出于某种原因改变了子类(我不会感到惊讶,他们在过去改变了更疯狂的事情),如果你使用空操作符,最坏的情况是它会出现。如果让statusBar:UIView=UIApplication.shared.value(forKey:“statusBar”)作为?UIView{statusBar.isHidden=false}这是一些有风险的代码。。。如果苹果出于某种原因改变了这个子类(我不会感到惊讶,他们在过去改变了更疯狂的东西),那就太好了!你救了我的命:)这会隐藏整个应用程序的状态栏。问题在于一种观点。
extension UINavigationController {
  override open var childForStatusBarStyle: UIViewController? {
    return self.topViewController
  }
}
override var prefersStatusBarHidden: Bool {
  return true
 }