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