【问题标题】:iPhone X home indicator dimming/undimmingiPhone X Home 指示灯调光/不调光
【发布时间】:2019-12-07 03:51:08
【问题描述】:

我正在使用这个来调暗 iPhone X 上的 Home 指示灯:

 override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
    return [.bottom]
 } 

现在在子视图控制器(使用 addChildViewController 添加)中,我想将其恢复为正常状态(即始终亮)。我尝试将子视图控制器中的这个 var 覆盖为 []

  override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
    return []
}

还有,

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

    self.setNeedsUpdateOfHomeIndicatorAutoHidden()
    self.setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
}

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

【问题讨论】:

  • 你如何使用你添加的子视图控制器?
  • 好吧,使用 addChild 然后将它的视图添加为子视图。
  • 新的 API 是什么?
  • 你好@matt,你能告诉我你指的是哪个新API吗?
  • 如果你想隐藏主页指示器,请尝试覆盖 prefersHomeIndicatorAutoHidden。

标签: ios uiviewcontroller uikit iphone-x


【解决方案1】:

如果您希望查询子视图控制器的preferredScreenEdgesDeferringSystemGestures,则父视图控制器必须实现childForScreenEdgesDeferringSystemGestures 以指向该子视图。

【讨论】:

  • 如果从屏幕的左上角或右上角向下滑动,您是否知道一种禁用下拉通知的方法>
【解决方案2】:

如果您使用 addChild(即没有真正呈现它)。我建议在您的主视图控制器中执行以下操作:

override func viewDidLayoutSubviews() {
    setNeedsUpdateOfScreenEdgesDeferringSystemGestures()    
}

override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
    return children.contains { type(of: $0) == ChildViewController.self } ? [] : [.bottom]
}

ChildViewController 是您的子视图控制器类。

当您将子视图控制器的视图添加为主视图控制器的子视图时,viewDidLayoutSubviews 将被调用并 setNeedsUpdateOfScreenEdgesDeferringSystemGestures strong> 将触发您覆盖的 preferredScreenEdgesDeferringSystemGestures,您可以在其中检查您是否有 ChildViewController 类型的子视图控制器并返回需要相应的值。

更新:

正如@matt 指出的那样,覆盖 childForScreenEdgesDeferringSystemGestures 将查询子视图控制器:

class ChildViewController: UIViewController {

    override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
        return []
    }

    // showing home indicator for child view controller
    override var prefersHomeIndicatorAutoHidden: Bool {
        return false
     }

}

class ViewController: UIViewController {

    override func viewDidLayoutSubviews() {
        setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
    }

    override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
        return [.bottom]
    }

    override var childForScreenEdgesDeferringSystemGestures: UIViewController? {
        return children.first { type(of: $0) == ChildViewController.self }
    }

    // hiding home indicator
    override var prefersHomeIndicatorAutoHidden: Bool {
        return true
    }

    // querying child view controller for home indicator preference 
    override var childForHomeIndicatorAutoHidden: UIViewController? {
        return children.first { type(of: $0) == ChildViewController.self }
    }
}

【讨论】:

  • 这很聪明,但它忽略了这个机制已经内置的事实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多