快速隐藏状态栏 4
Posted
技术标签:
【中文标题】快速隐藏状态栏 4【英文标题】:hide status bar swift 4 【发布时间】:2018-03-14 14:01:45 【问题描述】:我试图在我的一个 UIViewControllers (Swift 4) 中隐藏状态栏。
首先,我在Info.plist
中将基于控制器的状态栏外观设置为YES。
我覆盖了控制器中的 prefersStatusBarHidden
属性:
override var prefersStatusBarHidden: Bool
return true
在
viewDidLoad()
中,我添加了setNeedsStatusBarAppearanceUpdate()
函数来强制读取prefersStatusBarHidden
属性。
毕竟,我仍然看到UIViewController
上的状态栏。
有人可以帮帮我吗?
【问题讨论】:
也许如果你添加一些代码会有助于做出答案 看到这个***.com/questions/38876249/… @Anbu.Karthik 您链接的答案是 OP 已经完成的事情。 我已经尝试了@Anbu.Karthik 评论中提到的所有内容 你使用的是 UIPageViewController 还是其他视图层次结构? 【参考方案1】:您可以通过添加以下代码来隐藏任何或所有视图控制器中的状态栏:
override var prefersStatusBarHidden: Bool
return true
任何包含该代码的视图控制器都会默认隐藏状态栏。
如果你想为状态栏设置动画,只需在视图控制器上调用 setNeedsStatusBarAppearanceUpdate() - 这将强制再次读取 prefersStatusBarHidden,此时点您可以返回不同的值。如果您愿意,您对 setNeedsStatusBarAppearanceUpdate() 的调用实际上可以在动画块内,这会导致状态栏以平滑的方式隐藏或显示。
【讨论】:
我尝试了所有这些,甚至 UIApplication.shared.isStatusBarHidden = true 在 viewDidLoad() 中,但状态栏仍然存在...我阅读了 swift 4 更改日志,并且没有任何关于更改 prefersStatusBarHidden 的内容。 . 我在我的 Swift 4 项目中所做的只是添加了上面的覆盖,没有别的,它起作用了。无需更改 Info.plist 文件,无需调用 setNeedsStatusBarAppearanceUpdate() 为我工作。我没有碰plist。只需将上面的代码复制并粘贴到 UIViewController 子类中即可。【参考方案2】:您可能已经找到了自己的解决方案,但我是这样工作的:
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
【讨论】:
这是一些有风险的代码...如果 Apple 出于某种原因更改了子类(我不会感到惊讶,他们在过去更改了更疯狂的东西),crash boom bang 如果你改用空操作符,最坏的情况就是它会出现。如果让 statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as? UIView statusBar.isHidden = false 【参考方案3】:如果您以模态方式呈现视图控制器,请尝试
viewController.modalPresentationCapturesStatusBarAppearance = true
【讨论】:
不错!你救了我的命:)【参考方案4】:尝试将 Info.plist 中的“查看基于控制器的状态栏外观”标志设置为“是”。这将强制应用在每个视图控制器上调用 prefersStatusBarHidden: Bool
属性。
【讨论】:
【参考方案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
试试看,对我很有用。
【讨论】:
这是一些有风险的代码...如果 Apple 出于某种原因更改了子类(我不会感到惊讶,他们在过去更改了更疯狂的东西),crash boom bang【参考方案6】:使用以下代码
UIApplication.shared.isStatusBarHidden = true
这是我发现的唯一在 ios11 中工作的东西。
你可以写在didFinishLaunchingWithOptions
或你的'viewWillAppear'BaseViewController
享受吧。
【讨论】:
【参考方案7】:正如您所说,您正在使用 UINavigationController 导航到您的自定义视图控制器。我想您已将自定义视图控制器设置为 UINavigationController 的根视图。在这种情况下,在您的自定义视图控制器中覆盖 var prefersStatusBarHidden 将不起作用,但您必须继承您的 UINavigation 控制器并覆盖那里的属性,如下所示:-
class CustomNavigationController: UINavigationController
override var prefersStatusBarHidden: Bool
return true
【讨论】:
【参考方案8】:我发现 prefersStatusBarHidden
没有在我的视图控制器中被调用,因为我使用的是自定义容器视图,我需要将状态栏隐藏职责转发给子视图控制器。如果对我来说,在容器视图控制器中实现 var childForStatusBarHidden: UIViewController? return childViewController
是固定的。
【讨论】:
【参考方案9】:当您尝试重载 UINavigationStack 中 ViewController 的状态栏属性时 - 您需要在下面进行扩展
extension UINavigationController
override open var childForStatusBarStyle: UIViewController?
return self.topViewController
然后您的重载属性将变为活动状态
【讨论】:
【参考方案10】:我正在寻找它,而我的一项工作是
斯威夫特 5
override var prefersStatusBarHidden: Bool
return true
【讨论】:
【参考方案11】:尝试检查项目设置的常规部分下的隐藏状态栏。
【讨论】:
感谢您的回答,但我不需要隐藏整个应用的状态栏,只需要一个自定义 UIViewController 此设置最初只是隐藏状态栏,有助于确保在许多情况下隐藏状态栏。【参考方案12】:这些都不适合我在 iOS 11 中处理转换后的项目。这就是我所做的。我在 AppDelegate 中添加了这段代码
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool
application.isIdleTimerDisabled = true
application.isStatusBarHidden = true
return true
【讨论】:
【参考方案13】:只需将视图的“顶部空间”约束从安全区域更改为超级视图。它会将您的视图拖到状态栏下,因此无需隐藏它 ]1
【讨论】:
【参考方案14】:如果是子视图控制器需要在容器视图控制器中编写代码
override var prefersStatusBarHidden: Bool
return true
【讨论】:
【参考方案15】:将此添加到您的 info.plist
<key>UIStatusBarHidden</key>
<true/>
【讨论】:
这会隐藏整个应用程序的状态栏。问题是针对一种观点。以上是关于快速隐藏状态栏 4的主要内容,如果未能解决你的问题,请参考以下文章
Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法)
Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法)