在 iPad 处理横向模式旋转
Handling rotation to landscape mode on iPad
为了处理旋转在我的应用程序中,我使用了以下方法:
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
collectionView2.collectionViewLayout.invalidateLayout()
let pageControl = UIPageControl()
let indexPath = IndexPath(item: pageControl.currentPage, section: 0)
DispatchQueue.main.async {
self.collectionView2.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
self.collectionView2.reloadData()
}
}
现在,问题是,当我在 IPhone 设备上 运行 应用程序时,该方法被完美触发,布局不受旋转影响。
但是,当我 运行 它在 iPad 上并旋转到横向时,布局无法使 ui 内容居中 [在我的例子中 collectionView
].但是当我旋转回纵向时,布局会完美地重新居中。
出于某种原因,似乎 willTransition
功能在横向旋转时没有被触发。
根据我所做的一些小调查,它似乎与尺寸 类 有关!! Size classes
不涉及 iPad 纵向和横向之间的区别:它们都有常规宽度和常规高度,因此不会调用 willTransition 函数。
解决此问题的简单而简短的解决方法是什么?
尝试使用 viewWillTransition(调整大小:CGSize,协调器:UIViewControllerTransitionCoordinator)。
当视图控制器管理的视图的大小发生变化时调用它,即使大小 class 没有变化。
如果您的布局取决于正在完成的过渡,您可以在过渡完成后执行更新:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: nil) { _ in
// perform your updates
}
}
随着快速走动,您可以尝试注册每次旋转时都会收到的通知。
NotificationCenter.default.addObserver(self, selector:
#selector(YOUR_SELECTOR), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
以及选择器的实现
if UIDeviceOrientationIsPortrait(UIDevice.current.orientation) {
print("Portrait")
}
if UIDeviceOrientationIsLandscape(UIDevice.current.orientation) {
print("Landscape")
}
为了处理旋转在我的应用程序中,我使用了以下方法:
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
collectionView2.collectionViewLayout.invalidateLayout()
let pageControl = UIPageControl()
let indexPath = IndexPath(item: pageControl.currentPage, section: 0)
DispatchQueue.main.async {
self.collectionView2.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
self.collectionView2.reloadData()
}
}
现在,问题是,当我在 IPhone 设备上 运行 应用程序时,该方法被完美触发,布局不受旋转影响。
但是,当我 运行 它在 iPad 上并旋转到横向时,布局无法使 ui 内容居中 [在我的例子中 collectionView
].但是当我旋转回纵向时,布局会完美地重新居中。
出于某种原因,似乎 willTransition
功能在横向旋转时没有被触发。
根据我所做的一些小调查,它似乎与尺寸 类 有关!! Size classes
不涉及 iPad 纵向和横向之间的区别:它们都有常规宽度和常规高度,因此不会调用 willTransition 函数。
解决此问题的简单而简短的解决方法是什么?
尝试使用 viewWillTransition(调整大小:CGSize,协调器:UIViewControllerTransitionCoordinator)。
当视图控制器管理的视图的大小发生变化时调用它,即使大小 class 没有变化。
如果您的布局取决于正在完成的过渡,您可以在过渡完成后执行更新:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: nil) { _ in
// perform your updates
}
}
随着快速走动,您可以尝试注册每次旋转时都会收到的通知。
NotificationCenter.default.addObserver(self, selector:
#selector(YOUR_SELECTOR), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
以及选择器的实现
if UIDeviceOrientationIsPortrait(UIDevice.current.orientation) {
print("Portrait")
}
if UIDeviceOrientationIsLandscape(UIDevice.current.orientation) {
print("Landscape")
}