如何根据 ipad 上的方向更改布局?

Posted

技术标签:

【中文标题】如何根据 ipad 上的方向更改布局?【英文标题】:How to change layout based on orientation on ipad? 【发布时间】:2015-07-07 22:07:45 【问题描述】:

我只是在看新 ipad air 2 上的时钟应用程序,当改变方向时它会影响布局。世界时钟选项卡中有 6 个时钟,纵向有 2 行 3 个时钟,横向有 1 行 6 个时钟。

我没有看到任何基于 xcode 6 中允许区分横向和纵向的尺寸等级的东西,有没有不同/更好的方法来做到这一点?

【问题讨论】:

我没有 iPad Air 2,所以我不知道这是什么样的,但它可能是 UICollectionView 和不同的 UICollectionViewLayout。根据它的外观,它可能只是一个标准的UICollectionView 流布局。 How can I rearrange views when autorotating with autolayout? 的可能重复项(尽管这可以也可以使用尺寸等级) 在这里查看我的答案,这就是我的做法:***.com/questions/31189792/… 谢谢这些很好的答案,我也会考虑使用这个想法,看看哪个更好/更容易。 @nhgrif 关于您的回答的问题,我可以在尺寸等级中这样做,这样它就不会影响 iphone 吗?例如,假设我使用任意宽度常规高度来设置纵向约束,使用常规宽度任意高度来设置横向约束。因为我觉得如果我在任何情况下旋转 iPhone,横向限制都会影响它。 【参考方案1】:

有一个方法--willTransitionToTraitCollection:withTransitionCoordinator:--可以让您知道任何特征(例如水平尺寸类、垂直尺寸类、显示比例或用户界面习惯用法)何时发生变化。

UIDevice.currentDevice().userInterfaceIdiom != .Pad@时,您可以检查newCollection.verticalSizeClass,看看它是否等于.Compact(横向)或.Regular(纵向)

所以,例如:

override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 
    super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator: coordinator)
    if UIDevice.currentDevice().userInterfaceIdiom != .Pad 
        switch newCollection.verticalSizeClass 
        case .Compact:
            goLandscapeWithCoordinator(coordinator)
        case .Regular, .Unspecified:
            hideLandscapeWithCoordinator(coordinator)
        
    

goLandscapeWithCoordinator(coordinator) 可能看起来像这样,例如:

func goLandscapeWithCoordinator(coordinator: UIViewControllerTransitionCoordinator) 

    let landscapeVC = storyboard!.instantiateViewControllerWithIdentifier("LandscapeViewController") as? LandscapeViewController

    if let controller = landscapeVC 

        controller.view.frame = view.bounds
        controller.view.alpha = 0

        view.addSubview(controller.view)
        addChildViewController(controller)

        coordinator.animateAlongsideTransition( _ in
            controller.view.alpha = 1
            ,
            completion:  _ in
                controller.didMoveToParentViewController(self)
        )

    

【讨论】:

你能解释一下 goLandscapeWithCoordinator(coordinator) 是什么吗?如果 .Compact 更改视图控制器上的项目,我该怎么办。 @Suzukijak3 goLandscapeWithCoordinator(coordinator)hideLandscapeWithCoordinator(coordinator) 是您必须实现的自定义方法。例如,在goLandscapeWithCoordinator(coordinator) 中,您可以在代码中重新排列您的 UI 或实例化一个完全不同的视图控制器。 好的,所以一个名为 goLandscapeWithCoordinator 的函数。所以让我举个例子,对不起,我对 swift 还很陌生,所以请原谅我的任何错误。 func goLandscapeWithCoordinator(coordinator: UIViewControllerTransitionCoordinator) //do code here ?? @Suzukijak3 是的。我已经用一个例子更新了我的答案,这样你就可以理解了。 感谢您的帮助,如果您喜欢编写大量代码,这是一种绕过它的方法,但我目前没有看到绕过大量代码的另一种方法。【参考方案2】:

如果您打开故事板,您可以在控制台顶部找到“wAny hAny”,它允许您指定宽度和高度类型(紧凑、任意、常规)。如果您指定了某种类型然后在 storyboard 上进行布局工作,您的布局将仅在特定情况下显示,这意味着您可以在 storyboard 中为纵向和横向模式指定不同的布局。 例如,您可以选择“Compact Width | Regular Height”布局将在所有 iPhone 纵向模式下显示,如果您选择“Regular Width | Compact Height”布局将应用于 5.5 英寸 iPhone 在横向模式下。

【讨论】:

对,但没有像 iphone 那样的 ipad 纵向和 ipad 横向选项。这就是我需要的。 你是对的,没有像这样明确命名的尺寸类。根据定义,尺寸类别并不意味着定义特定设备,而是特定类别的屏幕。尺寸类是未来的首选方法,而不是明确的尺寸检查。 是的,我很难理解它,因为我来自 android,你可以指定方向和屏幕尺寸。但我会阅读更多关于此的内容,感谢您的帮助。

以上是关于如何根据 ipad 上的方向更改布局?的主要内容,如果未能解决你的问题,请参考以下文章

iPad - 方向变化和视图?

如何根据设备方向更改堆栈视图方向?

平板电脑布局,根据屏幕方向更改错误

如何根据ios中的方向更改图像位置?

iPad:如何根据方向(横向/纵向)显示不同的屏幕

以编程方式更改视图方向而无需旋转 ipad