iPhone X上默认每个控制器底部的Home Indicator都是默认不隐藏的,会一直显示. 对于想要在控制器中实现全屏的效果,不希望被Home Indicator影响效果, 需要重写
prefersHomeIndicatorAutoHidden()
方法:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
// 进入此控制器,Home Indicator将会显示, 若返回true,在此界面无操作的时候,Home Indicator将会自动隐藏, 返回false将会一直显示
override func prefersHomeIndicatorAutoHidden() -> Bool {
return true
}
}
需要注意的是,只重写控制器的此方法的这种情况只适用于此控制器没有父控制器的情形.而绝大部分的应用都是以TabBarController或NavigationController作为window的根控制器,ViewController来展示内容,这时还需要重写TabBarController 及NavigationController 的childViewControllerForHomeIndicatorAutoHidden()
方法
对于上图关系的应用,需要设置TabBarController的childViewControllerForHomeIndicatorAutoHidden()
采用每个navigationController中的设置, 并在navigationController中的childViewControllerForHomeIndicatorAutoHidden()
中设置为当前显示的控制器
class TabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
}
// 返回nil, 则自己的prefersHomeIndicatorAutoHidden()中的设置会生效
// 这里返回当前选中的控制器,使用该子控制器的设置
override func childViewControllerForHomeIndicatorAutoHidden() -> UIViewController? {
return selectedViewController
}
// 注意: 此方法中的设置生效的前提是上面这个方法返回nil
override func prefersHomeIndicatorAutoHidden() -> Bool {
return true
}
}
class NavagationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func childViewControllerForHomeIndicatorAutoHidden() -> UIViewController? {
return self.viewControllers.last
}
// 若希望在所有子控制器的界面都实现自动隐藏,则返回true, 并且在上面的方法中返回nil,注意一定要重写,不重写是没效果的
override func prefersHomeIndicatorAutoHidden() -> Bool {
return true
}
}
这样就可以在每个控制器中控制是否自动隐藏Home Indicator了