ios - 无法捕获 iOS 上从 "upsidedown"到横向的方向变化

标签 ios swift screen-orientation

当屏幕方向改变时,我需要使我的 Collection View 布局无效。由于 iPhone X 和其他设备都有安全区域插入;我需要根据屏幕安全区域插图定位单元格的 subview 。

如果您在纵向和左右横向之间切换,则没有问题。但如果你从颠倒切换,我无法捕捉到方向变化,并且自动无法

我尝试了两种现有的方法。

首先是使用NotificationCenter。其次是重写 viewWillTransitionToSize:withTransitionCoordinator: 函数。都是一样的。

在 CollectionViewController 中:

    NotificationCenter.default.addObserver(forName: UIDevice.orientationDidChangeNotification, object: nil, queue: nil) { (notif) in
      self.collectionViewLayout.invalidateLayout()
    }

在单元格中:

  override func layoutSubviews() {
    super.layoutSubviews()

    let orientation = UIDevice.current.orientation
    if let insets = UIApplication.shared.keyWindow?.safeAreaInsets {
      if orientation == .landscapeLeft {
        titleLabelLeadingConstraint.constant = insets.left + 20
        titleLabelTrailingConstraint.constant = 20
      } else if orientation == .landscapeRight {
        titleLabelLeadingConstraint.constant = 20
        titleLabelTrailingConstraint.constant = insets.right + 20
      } else {
        titleLabelLeadingConstraint.constant = 20
        titleLabelTrailingConstraint.constant = 20
      }
    }

    print("orin: \(orientation.rawValue) | left: \(titleLabelLeadingConstraint.constant) | right: \(titleLabelTrailingConstraint.constant)")

  }

当您从倒置状态切换到倒置状态时,不会调用 print() 函数。但是collectionviewlayoutinvalidateLayout()函数正在被调用。

最佳答案

正如您已经尝试过的那样,您可以使用 viewWillTransitionToSize:withTransitionCoordinator: 检测方向变化。

我不知道你的第一次尝试,但是,尝试一下:

      override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
         //If you need to invalidate your collectionView layout, do it in this function
         super.viewWillTransition(to: size, with: coordinator)
         if UIDevice.current.orientation.isLandscape {
          //
         } else {
           //
         }
      }

如果您需要知道landscapeLeft 或Right 之间的区别,请按以下方式尝试您的代码:

      override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
         //If you need to invalidate your collectionView layout, do it in this function
    super.viewWillTransition(to: size, with: coordinator)

     if let insets = UIApplication.shared.keyWindow?.safeAreaInsets {
        if UIDevice.current.orientation == .landscapeLeft {

        titleLabelLeadingConstraint.constant = insets.left + 20
        titleLabelTrailingConstraint.constant = 20

      } else if UIDevice.current.orientation == .landscapeRight {

        titleLabelLeadingConstraint.constant = 20
        titleLabelTrailingConstraint.constant = insets.right + 20

      } else {

        titleLabelLeadingConstraint.constant = 20
        titleLabelTrailingConstraint.constant = 20

      }
    }
  }

NOTE: You don't need to register an observer

关于ios - 无法捕获 iOS 上从 "upsidedown"到横向的方向变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56346192/

相关文章:

ios - 当调用某些函数时变量消失

ios - Alamofire:发送 JSON 作为请求参数

ios - 从 View 模型到 View Controller 类的函数调用

swift - 不同 Y 级别的 UIButton 无法在 tvOS 上聚焦

ios - 在 Swift 中使用动画调整 CALayer 的大小

android - 使用按钮以编程方式更改屏幕方向

ios - 如何更改不在 Storyboard 中的 viewController 的方向

ios - 从 UITableView 选择行时将核心数据对象传递给另一个 View Controller

android - searchview 不再关注方向变化

ios - 如何使用带有 RKObjectMapping 的 RestKit 0.24 将本地 JSON 字符串映射到对象?