【问题标题】:How to get safeAreaInsets in viewWillTransitionToSize (iPhone X)如何在 viewWillTransitionToSize (iPhone X) 中获取 safeAreaInsets
【发布时间】:2021-10-04 10:01:10
【问题描述】:

我正在尝试更新 iPhoneX 的 viewWillTransition(to size: with coordinator:) 方法。 但我无法获得 safeAreaInsets 值的目的地。 请帮忙!

override func viewWillTransition(to size: CGSize,
        with coordinator: UIViewControllerTransitionCoordinator) {

    super.viewWillTransition(to: size, with: coordinator)

    if #available(iOS 11.0, *) {
        if let window = UIApplication.shared.keyWindow { 
            let insets = window.safeAreaInsets
            contentFrame = CGRect(x:insets.left, y:insets.top,
                width:size.width - insets.left - insets.right,
                height:size.height - insets.top - insets.bottom)
        }
    } else {
        contentFrame = CGRect(x:0,y:0,width:size.width, height:size.height)
    }
    self.updateViews()
}

【问题讨论】:

  • “我无法获取 sefeAreaInsets 值的目的地”是什么意思?有什么问题?为什么要查看窗口?你的代码没有意义。你到底想做什么?
  • 我想要旋转后的值。此时是旋转之前
  • viewWillTransitionToSize 只有一件事:大小。旋转后大小的值为size。你认为这与安全区域插图有什么关系?我再次问你:你为什么需要这些信息?你最终想要做什么? (我第二次问了。)
  • 做旋转动画例程。
  • 那么也许你应该说出它们是什么。您在代码中需要此信息的事实是“难闻的气味”。你之前没有关注顶部和底部的布局指南,那么为什么你现在关心安全区域插图呢?我再次问你:有什么问题?你看,这是一个 x-y 问题。你没有问你真正想知道什么,你做了一个错误的假设,现在你对它不起作用感到不安。它不会工作;这是错误的。您需要退后一步,询问您的真正问题。

标签: ios swift iphone-x


【解决方案1】:

我在 Stackoverflow Japan 获得了有效的解决方案。

它只是在UIViewControllerTransitionCoordinator.animate(alongsideTransition:completion:) 闭包中获得插入,如下所示:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { (context) in
        ...

        let insets = ...safeAreaInsets

        ...
    }, completion: nil)
}

【讨论】:

    【解决方案2】:

    我也有这个问题。经过试验,我发现了一个不错的解决方法,无需等待过渡完成。

    1. 有一个锚定到安全区域的视图(我们称之为SizeListenerView),这样我们只需要监听这个视图的大小变化

    SizeListenerView

        override var bounds: CGRect {
            didSet {
                // now you can access the bounds here
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2018-04-12
      • 2021-07-17
      • 2016-01-01
      • 1970-01-01
      • 2010-12-09
      • 2010-11-28
      • 2018-09-29
      • 1970-01-01
      相关资源
      最近更新 更多