如何使用大小类(Size class)设计iPad横向和纵向屏幕具有不同布局的界面。
我只能找到w-regular和h-regular用于两种方向。例如:我需要使用大小类在纵向时垂直对齐2个视图,在横向时水平对齐。
我只能找到w-regular和h-regular用于两种方向。例如:我需要使用大小类在纵向时垂直对齐2个视图,在横向时水平对齐。
if traitCollection.verticalSizeClass == .Regular && traitCollection.horizontalSizeClass == .Regular {
var orientation:UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation;
if orientation == UIInterfaceOrientation.LandscapeLeft || orientation == UIInterfaceOrientation.LandscapeRight {
// orientation is landscape
} else {
// orientation is portrait
}
}
苹果似乎打算将两种iPad方向视为相同的 - 但正如我们中的许多人发现的那样,有非常合理的设计原因要在iPad纵向和iPad横向上变化UI布局。
然而,请参见此答案以另一种方法来适应大小类以满足我们的需求: https://dev59.com/Fl8d5IYBdhLWcg3wmDOf#28268200
对于 Swift 3,代码如下:
override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
if UI_USER_INTERFACE_IDIOM() == .pad &&
view.bounds.width > view.bounds.height {
let collections = [UITraitCollection(horizontalSizeClass: .regular),
UITraitCollection(verticalSizeClass: .compact)]
return UITraitCollection(traitsFrom: collections)
}
return super.overrideTraitCollection(forChildViewController: childViewController)
}
在iPad设备的横屏模式下,它将使用wRhC而不是wRhR。 将此代码放入基础视图控制器中,即此规则将适用于由此控制器呈现的所有控制器。 您可以在此处添加任何其他条件...例如,如果您希望此规则仅在特定视图控制器中起作用,则您的if运算符将如下所示:
if UI_USER_INTERFACE_IDIOM() == .pad &&
childViewController is YourSpecificViewController &&
view.bounds.width > view.bounds.height {
let collections = [UITraitCollection(horizontalSizeClass: .regular),
UITraitCollection(verticalSizeClass: .compact)]
return UITraitCollection(traitsFrom: collections)
}
override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
if UIDevice.current.userInterfaceIdiom == .pad && UIDevice.current.orientation.isLandscape {
return UITraitCollection(traitsFrom:[UITraitCollection(verticalSizeClass: .compact), UITraitCollection(horizontalSizeClass: .regular)])
}
return super.overrideTraitCollection(forChildViewController: childViewController)
}
import UIKit
class NavigationControllerWithTraitOverride: UINavigationController {
// If you make a navigationController a member of this class the descendentVCs of that navigationController will have their trait collection overridden with compact vertical size class if the user is on an iPad and the device is horizontal.
override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
if UIDevice.current.userInterfaceIdiom == .pad && UIDevice.current.orientation.isLandscape {
return UITraitCollection(traitsFrom:[UITraitCollection(verticalSizeClass: .compact), UITraitCollection(horizontalSizeClass: .regular)])
}
return super.overrideTraitCollection(forChildViewController: childViewController)
}
}