【问题标题】:How can I change the frame of the status bar?如何更改状态栏的框架?
【发布时间】:2016-01-31 03:01:37
【问题描述】:

我试过用它来获取状态栏的框架:

var statusBarWindow = UIApplication.sharedApplication().valueForKey("statusBarWindow")

但是,当我尝试更改框架时,它说该值是不可变的:

statusBarWindow?.frame = CGRect(x: -oldViewFrame, y: statusBarWindow.frame.origin.y, width: statusBarWindow.frame.size.width, height: statusBarWindow.frame.size.height)

【问题讨论】:

标签: ios swift uikit uistatusbar


【解决方案1】:

我会根据你写的关于你对这个问题的意图的cmets给你一个答案。


解决方案

您可以在打开侧边栏时让状态栏消失(类似于 Slack 应用程序),方法是从侧边栏的 UIViewController 覆盖方法 prefersStatusBarHidden。它应该类似于以下内容:

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

你也可以通过preferredStatusBarStylepreferredStatusBarUpdateAnimation两种方法修改它的外观


示例

我做了一个简单的项目来说明这一点。可以通过多种不同的方式实现侧边栏,因此我将这个示例基于弹出框。您的实施将取决于您如何实施侧边栏。

我制作了一个简单的故事板,其中每个都有两个UIViewController 和一个UIButton。当点击第一个UIButton 时,会触发一个Present As Popover 类型的segue,显示第二个控制器。

第一个UIViewController 没有代码(一切都在故事板中完成),但第二个UIViewController 有隐藏状态栏的代码。

我附上了故事板的屏幕截图和下面第二个UIViewController 的代码。

//
//  PopController.swift
//  SidebarHideStatus
//
//  Created by Stefan Veis Pennerup on 31/01/16.
//  Copyright © 2016 Kumuluzz. All rights reserved.
//

import UIKit

class PopController: UIViewController {

    // MARK: - Storyboard actions

    @IBAction func backButtonPressed(sender: UIButton) {
        dismissViewControllerAnimated(true, completion: nil)
    }

    // MARK: - Status bar

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


更新 1:OP 使用 UIView 而不是 UIViewController 作为侧边栏。

首先,我建议您将侧边栏分解为一个单独的UIViewController,因为这将使其在未来更加可重用,但这是一个完全不同的讨论,可能会持续数天!

为了隐藏状态栏,那你还是需要使用我之前高亮的回调方法,但你只需要调用setNeedsStatusBarAppearanceUpdate方法手动更新即可。

我已使用以下代码更新了初始 UIViewController 并删除了 segue 以演示此方法。

//
//  ViewController.swift
//  SidebarHideStatus
//
//  Created by Stefan Veis Pennerup on 31/01/16.
//  Copyright © 2016 Kumuluzz. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    // MARK: - Properties

    private var isSidebarShown = false

    // MARK: - Storyboard outlets

    @IBAction func buttonPressed(sender: UIButton) {
        isSidebarShown = !isSidebarShown
        setNeedsStatusBarAppearanceUpdate()
    }

    // MARK: - Status bar

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

    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation {
        // NOTE: This method has no effect now when
        // using the method setNeedsStatusBarAppearanceUpdate()
        return .Slide
    }

}

【讨论】:

  • 谢谢,但我认为我不能在我的项目中实现这一点,因为我使用 UIView 来固定侧边栏。我使用 UIViewAnimation 来移动绑定到当前 VC 的视图,并将侧边栏移动了我设置原始视图的量。因此,从本质上讲,我并没有对任何其他 VC 表示不满。那么如果使用一个 VC,如何刷新视图以重新触发 prefersstatusbarhidden 功能?
  • 谢谢@Kumuluzz!这解决了问题。不过我有一个问题要问你:我将 UIView 子类化以创建侧边栏,所以它仍然可以重用,不是因为它是最好的,而是我能想出的唯一解决方案。与我所做的相比,创建 UIVC 会有什么优势?我肯定想成为一个更好的程序员,所以如果你能尽可能详细地表达出来,我将非常感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 2012-09-20
相关资源
最近更新 更多