如何根据 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 更改视图控制器上的项目,我该怎么办。 @Suzukijak3goLandscapeWithCoordinator(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 上的方向更改布局?的主要内容,如果未能解决你的问题,请参考以下文章