当屏幕方向改变时,我需要使我的 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()
函数。但是collectionviewlayout
的invalidateLayout()
函数正在被调用。
最佳答案
正如您已经尝试过的那样,您可以使用 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/