Ios iPhone X主屏幕指示灯变暗/取消闪烁

Ios iPhone X主屏幕指示灯变暗/取消闪烁,ios,uiviewcontroller,uikit,iphone-x,Ios,Uiviewcontroller,Uikit,Iphone X,我正在使用以下方法调暗iPhone X上的主指示灯: override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge { return [.bottom] } 现在在子视图控制器(使用addChildViewController添加)中,我想将其恢复到正常状态(即始终亮)。我尝试在子视图控制器中将此变量重写为[] override var preferredScreenEdgesDeferringSys

我正在使用以下方法调暗iPhone X上的主指示灯:

 override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
    return [.bottom]
 } 
现在在子视图控制器(使用addChildViewController添加)中,我想将其恢复到正常状态(即始终亮)。我尝试在子视图控制器中将此变量重写为[]

  override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
    return []
}
而且

 override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    self.setNeedsUpdateOfHomeIndicatorAutoHidden()
    self.setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
}

但什么也没发生。我做错了什么?

如果您使用添加子视图控制器中的子视图控制器添加子视图控制器,我不认为您在子视图控制器中被覆盖的首选屏幕边缘延迟系统手势会被调用(即,没有真正显示它)。我建议在主视图控制器中执行以下操作:

重写func viewdilayoutsubviews(){
SetNeedsUpdateOfScreenedgesDeferring系统手势()
}
覆盖变量PreferredScreenEdgesDeferringSystemPires:UIRectEdge{
返回children.contains{type(of:$0)==ChildViewController.self}?[]:[.bottom]
}
其中ChildViewController是您的子视图控制器类

当您将子视图控制器的视图添加为主视图控制器的子视图时,viewDidLayoutSubviews将被调用,SetNeedsUpdateOfScreenedDeferring系统手势将触发覆盖的首选屏幕边缘Deferring系统手势,检查您是否有子视图查看类型为ChildViewController的控制器,并相应地返回所需的值

更新:

正如@matt所指出的,重写childforscreenedgesderringsystempirters将查询子视图控制器中的相同内容:

类ChildViewController:UIViewController{
覆盖变量PreferredScreenEdgesDeferringSystemPires:UIRectEdge{
返回[]
}
//显示子视图控制器的主指示器
覆盖变量preferShomeIndicator自动隐藏:Bool{
返回错误
}
}
类ViewController:UIViewController{
重写func viewdilayoutsubviews(){
SetNeedsUpdateOfScreenedgesDeferring系统手势()
}
覆盖变量PreferredScreenEdgesDeferringSystemPires:UIRectEdge{
返回[底部]
}
override var childforScreenedgesDeferring系统手势:UIViewController{
返回children.first{type(of:$0)==ChildViewController.self}
}
//隐藏主指示器
覆盖变量preferShomeIndicator自动隐藏:Bool{
返回真值
}
//查询主指示器首选项的子视图控制器
覆盖var childForHomeIndicatorAutoHidden:UIViewController{
返回children.first{type(of:$0)==ChildViewController.self}
}
}

如果您使用addChild添加您的子视图控制器,我认为您在子视图控制器中被覆盖的首选屏幕边缘延迟系统手势不会被调用(也就是说,没有真正显示它)。我建议在主视图控制器中执行以下操作:

重写func viewdilayoutsubviews(){
SetNeedsUpdateOfScreenedgesDeferring系统手势()
}
覆盖变量PreferredScreenEdgesDeferringSystemPires:UIRectEdge{
返回children.contains{type(of:$0)==ChildViewController.self}?[]:[.bottom]
}
其中ChildViewController是您的子视图控制器类

当您将子视图控制器的视图添加为主视图控制器的子视图时,viewDidLayoutSubviews将被调用,SetNeedsUpdateOfScreenedDeferring系统手势将触发覆盖的首选屏幕边缘Deferring系统手势,检查您是否有子视图查看类型为ChildViewController的控制器,并相应地返回所需的值

更新:

正如@matt所指出的,重写childforscreenedgesderringsystempirters将查询子视图控制器中的相同内容:

类ChildViewController:UIViewController{
覆盖变量PreferredScreenEdgesDeferringSystemPires:UIRectEdge{
返回[]
}
//显示子视图控制器的主指示器
覆盖变量preferShomeIndicator自动隐藏:Bool{
返回错误
}
}
类ViewController:UIViewController{
重写func viewdilayoutsubviews(){
SetNeedsUpdateOfScreenedgesDeferring系统手势()
}
覆盖变量PreferredScreenEdgesDeferringSystemPires:UIRectEdge{
返回[底部]
}
override var childforScreenedgesDeferring系统手势:UIViewController{
返回children.first{type(of:$0)==ChildViewController.self}
}
//隐藏主指示器
覆盖变量preferShomeIndicator自动隐藏:Bool{
返回真值
}
//查询主指示器首选项的子视图控制器
覆盖var childForHomeIndicatorAutoHidden:UIViewController{
返回children.first{type(of:$0)==ChildViewController.self}
}
}

如果希望查阅子视图控制器的首选屏幕边缘延迟系统手势,父视图控制器必须为ScreenedGesDeferring系统手势实现
ChildforScreenedGesDeferring系统手势
,以指向该子视图控制器。

如果要查看子视图控制器的
首选屏幕边缘Deferring系统手势
,父视图控制器必须实现ChildForScreenedgesDeferring系统手势的
ChildForScreenedgesDeferring系统手势来指向该子视图。

如何使用添加的子视图控制器?使用addChild,然后将其视图添加为子视图。新的API是什么?Hello@matt,你能告诉我你指的是哪个新的API吗?如果你想隐藏主指示器,试着覆盖PreferShomeIndicator或AutoHidden。你如何使用添加的子视图控制器?好的,使用addChild,然后将其视图添加为子视图。新的API是什么?Hello@matt,你能告诉我吗