在 iPad 上处理旋转到横向模式

Posted

技术标签:

【中文标题】在 iPad 上处理旋转到横向模式【英文标题】:Handling rotation to landscape mode on iPad 【发布时间】:2018-02-06 14:18:08 【问题描述】:

为了处理旋转在我的应用程序中,我使用以下方法:

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 类有关! Size classes 没有涵盖 iPad 纵向和横向之间的区别:它们都有常规宽度和常规高度,因此不会调用 willTransition 函数。

解决这个问题的简单短方法是什么?

【问题讨论】:

【参考方案1】:

尝试改用 viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)。

当视图控制器管理的视图大小发生变化时调用,即使大小类没有变化。

如果您的布局依赖于正在完成的转换,您可以在转换完成后执行更新:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: nil)  _ in
        // perform your updates
    
 

【讨论】:

【参考方案2】:

您可以快速四处走动,尝试注册每次轮换时都会收到的通知。

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")

【讨论】:

以上是关于在 iPad 上处理旋转到横向模式的主要内容,如果未能解决你的问题,请参考以下文章

即使 iPad 处于纵向模式,如何强制 iPad 上的电视处于横向模式

使用 SwiftUI 将设备旋转到横向时出现导航栏

monotouch 在横向模式和纵向模式下旋转

元素无法从纵向切换到横向 ipad

仅将一个视图旋转到横向

从纵向模式旋转到横向模式时,搜索栏会丢失 FirstResponder