隐藏状态栏swift 4

时间:2017-10-03 11:26:21

标签: ios swift4

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

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

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

override var prefersStatusBarHidden: Bool {
     return true
}
  • viewDidLoad()中,我添加了setNeedsStatusBarAppearanceUpdate()函数来强制读取prefersStatusBarHidden属性。

毕竟,我仍然会在UIViewController上看到状态栏。

有人可以帮帮我吗?

15 个答案:

答案 0 :(得分:22)

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

override var prefersStatusBarHidden: Bool {
     return true
   }

任何包含该代码的视图控制器都会默认隐藏状态栏。

如果要为状态栏设置动画,请在视图控制器上调用 setNeedsStatusBarAppearanceUpdate() - 这将强制再次读取 prefersStatusBarHidden ,你可以返回一个不同的值。如果需要,您对 setNeedsStatusBarAppearanceUpdate()的调用实际上可以在动画块内,这会导致状态栏隐藏或以平滑的方式显示。

答案 1 :(得分:6)

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

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
}

答案 2 :(得分:5)

虽然有些实现更清晰,例如:

UIApplication.shared.isStatusBarHidden = true

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

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
}

尝试一下,对我很有用。

答案 3 :(得分:3)

尝试设置"查看基于控制器的状态栏外观"在Info.plist中标记为YES。这将强制app在每个视图控制器上调用mysqldump属性。

View controller-based status bar appearance flag

答案 4 :(得分:1)

使用以下代码 {floor(x-y)%1D00:00}[d1;d2]

这是我发现的唯一可以在iOS11中运行的东西。 你可以写在UIApplication.shared.isStatusBarHidden = true或在' viewWillAppear'你didFinishLaunchingWithOptions 享受。

答案 5 :(得分:1)

如果您以模态方式呈现视图控制器,请尝试

viewController.modalPresentationCapturesStatusBarAppearance = true

答案 6 :(得分:1)

正如您所说,您正在使用UINavigationController导航到自定义视图控制器。我想您已经将Custom View控制器设置为UINavigationController的根视图。在这种情况下,在自定义视图控制器中覆盖var preferredsStatusBarHidden无效,但是您将必须继承UINavigation Controller的子类,并在此处覆盖属性,如下所示:-

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
          let vc = UIStoryboard.init(name: "ProductListing", bundle: Bundle.main).instantiateViewController(withIdentifier: "ProductListingViewController") as? ProductListingViewController
    (superview?.next as? ProductListingViewController)?.navigationController?.pushViewController(vc!, animated: true)}

答案 7 :(得分:1)

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

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

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

答案 8 :(得分:0)

尝试检查项目设置的常规部分下的隐藏状态栏

Hide status bar option under Project settings/General

答案 9 :(得分:0)

对于我来说,这些都不适用于iOS 11中的转换项目。这就是我所做的。我在AppDelegate中添加了这段代码

func application(_ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool
{
    application.isIdleTimerDisabled = true
    application.isStatusBarHidden = true
    return true
}

答案 10 :(得分:0)

只需将视图的“顶部空间限制”从“安全”区域更改为“超级视图”即可。它将在状态栏下拖动您的视图,因此无需隐藏它{{0 }}] 1

答案 11 :(得分:0)

我发现在视图控制器中未调用prefersStatusBarHidden,因为我使用的是自定义容器视图,因此需要将状态栏隐藏责任转发给子视图控制器。如果对我来说,在容器视图控制器中实现var childForStatusBarHidden: UIViewController? { return childViewController }是固定的。

答案 12 :(得分:0)

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

array_filter

答案 13 :(得分:0)

将此添加到您的 info.plist

<key>UIStatusBarHidden</key>
    <true/>

答案 14 :(得分:0)

我正在寻找它,而对我来说是一个工作

快速5

   $("#NoeticeBoardGetAllFrm").submit(function(e) {
        e.preventDefault();

        console.log( new FormData(this));
        $.ajax({
            url: $("#NoeticeBoardGetAllUrl").val(),
            type: 'POST',
              headers: {'Accept': 'application/json','Content-Type': 'application/json',
                'DBAuth': $("#DBAuth").val(),'Authorization': $("#Authorization").val(),},
            dataType: 'json',
            data: new FormData(this),
            cache: false,
            contentType: false,
            processData: false,
            success: function (data) {
                if (data.error == 0) {
                    $("#NoeticeBoardGetAllResult").html("Record fetched successfully!");
                    $("#NoeticeBoardGetAllResult").addClass("alert alert-success");

                } else {
                    $("#NoeticeBoardGetAllResult").html(data.errmsg);
                    $("#NoeticeBoardGetAllResult").addClass("alert alert-warning");
                }
            }, statusCode: {
                500: function (data) {
                    $("#NoeticeBoardGetAllResult").html("Something went wrong!");
                    $("#NoeticeBoardGetAllResult").addClass("alert alert-danger");
                },
                401: function (data) {
                    $("#NoeticeBoardGetAllResult").html("Login Failed");
                    $("#NoeticeBoardGetAllResult").addClass("alert alert-danger");
                }
            }
        });
        setTimeout(function(){ resetResult(); }, 3000);
    });