在iPad上处理轮播到横向模式

时间:2018-02-06 14:18:08

标签: ios swift 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类有关!! Size classes没有涵盖iPad Portrait和Landscape之间的区别:它们都有Regular Width和Regular Height,因此willTransition func不会被调用。

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

2 个答案:

答案 0 :(得分:0)

尝试使用viewWillTransition(大小:CGSize,带协调器:UIViewControllerTransitionCoordinator)。

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

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

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

答案 1 :(得分:0)

随着快速走动,您可以尝试注册每次轮换所带来的通知。

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