iPad 的自适应布局
Adaptive layout for iPad
我正在关注这篇关于在 ios Building Adaptive User Interfaces for iOS 8 中构建自适应布局的文章。
它在 iPhone 上可以正常工作。
现在我不想对 iPad 产生同样的效果。但是对于 iPad 自适应布局不起作用。
这是iPhone5中的应用截图(绿框代表view1,黄框代表view2)
1.Portrait模式
- 横向模式
问题:iPad如何实现同样的效果?
扩展问题:如何在横向模式下设置 iPad 的初始方向?
iPad 的问题是两个方向都表示为常规。
其中一个解决方案是将两个 IBOutlet 集合添加到您希望发生此方向更改的视图控制器中,例如:
@IBOutlet var landscapeConstraints: [NSLayoutConstraint]!
@IBOutlet var portraitConstraints: [NSLayoutConstraint]!
转到情节提要,切换到您希望在 iPad 纵向方向上发生的自适应布局,并控制从每个 ACTIVE 约束拖动到 portraitConstraints IBOutlet。
将 Adaptive Layout 更改为您想要的横向布局,并再次控制从 ACTIVE 约束到 landscapeConstraints IBOutlet 的拖动。
在视图控制器中覆盖 viewWillTransitionToSize
方法:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
let transitionToLandscape = size.width > size.height
let constraintsToUninstall = transitionToLandscape ? ortraitConstraints : landscapeConstraints
let constraintsToInstall = transitionToLandscape ? landscapeConstraints : portraitConstraints
view.layoutIfNeeded()
coordinator.animateAlongsideTransition({
_ in
NSLayoutConstraint.deactivateConstraints(constraintsToUninstall)
NSLayoutConstraint.activateConstraints(constraintsToInstall)
self.view.layoutIfNeeded()
}, completion: nil)
}
// 展开,约束示例:
转到任意大小 class 并查看约束,其中一些将被 gay 掉,这意味着此处不活动但将在不同大小 classes 中活动,例如任何常规。
// 展开
要设置初始方向,您可以覆盖 viewWillAppear 和 install/uninstall 正确的约束:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
let transitionToLandscape = view.frame.size.width > view.frame.size.height
let constraintsToUninstall = transitionToLandscape ? portraitConstraints : landscapeConstraints
let constraintsToInstall = transitionToLandscape ? landscapeConstraints : portraitConstraints
view.layoutIfNeeded()
NSLayoutConstraint.deactivateConstraints(constraintsToUninstall)
NSLayoutConstraint.activateConstraints(constraintsToInstall)
}
我正在关注这篇关于在 ios Building Adaptive User Interfaces for iOS 8 中构建自适应布局的文章。
它在 iPhone 上可以正常工作。
现在我不想对 iPad 产生同样的效果。但是对于 iPad 自适应布局不起作用。
这是iPhone5中的应用截图(绿框代表view1,黄框代表view2)
1.Portrait模式
- 横向模式
问题:iPad如何实现同样的效果?
扩展问题:如何在横向模式下设置 iPad 的初始方向?
iPad 的问题是两个方向都表示为常规。
其中一个解决方案是将两个 IBOutlet 集合添加到您希望发生此方向更改的视图控制器中,例如:
@IBOutlet var landscapeConstraints: [NSLayoutConstraint]!
@IBOutlet var portraitConstraints: [NSLayoutConstraint]!
转到情节提要,切换到您希望在 iPad 纵向方向上发生的自适应布局,并控制从每个 ACTIVE 约束拖动到 portraitConstraints IBOutlet。 将 Adaptive Layout 更改为您想要的横向布局,并再次控制从 ACTIVE 约束到 landscapeConstraints IBOutlet 的拖动。
在视图控制器中覆盖 viewWillTransitionToSize
方法:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
let transitionToLandscape = size.width > size.height
let constraintsToUninstall = transitionToLandscape ? ortraitConstraints : landscapeConstraints
let constraintsToInstall = transitionToLandscape ? landscapeConstraints : portraitConstraints
view.layoutIfNeeded()
coordinator.animateAlongsideTransition({
_ in
NSLayoutConstraint.deactivateConstraints(constraintsToUninstall)
NSLayoutConstraint.activateConstraints(constraintsToInstall)
self.view.layoutIfNeeded()
}, completion: nil)
}
// 展开,约束示例:
转到任意大小 class 并查看约束,其中一些将被 gay 掉,这意味着此处不活动但将在不同大小 classes 中活动,例如任何常规。
// 展开
要设置初始方向,您可以覆盖 viewWillAppear 和 install/uninstall 正确的约束:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
let transitionToLandscape = view.frame.size.width > view.frame.size.height
let constraintsToUninstall = transitionToLandscape ? portraitConstraints : landscapeConstraints
let constraintsToInstall = transitionToLandscape ? landscapeConstraints : portraitConstraints
view.layoutIfNeeded()
NSLayoutConstraint.deactivateConstraints(constraintsToUninstall)
NSLayoutConstraint.activateConstraints(constraintsToInstall)
}