如何根据 ipad 上的方向更改布局?
How to change layout based on orientation on ipad?
我刚刚在新 ipad air 2 上查看时钟应用程序,当更改方向时它会影响布局。世界时钟选项卡中有 6 个时钟,纵向有 2 行,每行 3 个时钟,但横向有 1 行,每行 6 个时钟。
根据 xcode 中的尺寸 类,我没有看到任何东西 6 允许区分横向和纵向,是否有 different/better 方法来做到这一点?
有一种方法——willTransitionToTraitCollection:withTransitionCoordinator:——可以让您了解任何特征(例如水平尺寸 class、垂直尺寸 class、显示比例或用户界面惯用语)变化。
当 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)
})
}
}
如果你打开故事板,你可以在控制台顶部找到 "wAny hAny",它允许你指定宽度和高度类型(紧凑、任意、常规)。如果您指定了某种类型然后在 Storyboard 上进行布局工作,您的布局将仅在特定情况下显示,这意味着您可以在 Storyboard 中为纵向和横向模式指定不同的布局。
例如,您可以选择 "Compact Width | Regular Height" 布局将在所有 iPhone 纵向模式下显示,如果您选择 "Regular Width | Compact Height" 布局将在横向模式下应用于 5.5 英寸 iPhone。
我刚刚在新 ipad air 2 上查看时钟应用程序,当更改方向时它会影响布局。世界时钟选项卡中有 6 个时钟,纵向有 2 行,每行 3 个时钟,但横向有 1 行,每行 6 个时钟。
根据 xcode 中的尺寸 类,我没有看到任何东西 6 允许区分横向和纵向,是否有 different/better 方法来做到这一点?
有一种方法——willTransitionToTraitCollection:withTransitionCoordinator:——可以让您了解任何特征(例如水平尺寸 class、垂直尺寸 class、显示比例或用户界面惯用语)变化。
当 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)
})
}
}
如果你打开故事板,你可以在控制台顶部找到 "wAny hAny",它允许你指定宽度和高度类型(紧凑、任意、常规)。如果您指定了某种类型然后在 Storyboard 上进行布局工作,您的布局将仅在特定情况下显示,这意味着您可以在 Storyboard 中为纵向和横向模式指定不同的布局。 例如,您可以选择 "Compact Width | Regular Height" 布局将在所有 iPhone 纵向模式下显示,如果您选择 "Regular Width | Compact Height" 布局将在横向模式下应用于 5.5 英寸 iPhone。