Gab*_*und 6 constraints ipad ios autolayout swift
寻找一种干净的解决方案来以编程方式布置 UI 并使其在每台设备上看起来都正确。我试过扩展 CGFloat 以根据设备缩放数字
extension CGFloat {
func scale() {
// Modifies self by multiplies by the ratio between the initial screen size and the desired screen size
}
}
// usage
view.widthAnchor.constraint(equalToConstant: 20.scale())
Run Code Online (Sandbox Code Playgroud)
我还尝试为 iPhone 和 iPad 创建两组不同的约束并根据运行应用程序的设备激活它们,但这似乎不必要地冗长。
我如何布局我的 UI 以便它可以在所有设备上运行而没有hacky 解决方法。我应该避免某些类型的限制吗?(例如,不是设置宽度/高度常量,而是将它们设置为屏幕(或其他视图)宽度/高度的倍数?)
编辑:我不想过度解释我自己的情况,所以让我重新提出这个问题。在为 iPhone 和 iPad 设计的应用程序中设置约束的最佳实践有哪些?只检查设备是否是 iPad,如果是,只对 iPad 进行限制,如果不是,只对 iPhone 进行限制,这是不好的做法。
仅检查设备是否是 iPad 是否是一种不好的做法?如果是,则仅对 iPad 进行限制,如果不是,则仅对 iPhone 进行限制。
如果您计划支持分割视图,那绝对是不行的。实现和处理这个问题的代码总是有点冗长。这里没有任何一句台词可以实现您想要的目标。
在您的-[UIViewController viewDidLoad]方法中,您需要使用控制器视图可用的基本特征集合来设置视图。这是你的起点。
当您的应用程序的窗口由操作系统调整大小时(想象一下将横向模式下的全屏应用程序更改为分割大小的应用程序,占据屏幕的三分之一):-[UIViewController traitCollectionDidChange:]在视图控制器上调用该方法。您可以在此处更新布局约束。
您可以而且应该将布局逻辑封装在一个方法中,并从-[UIViewController viewDidLoad]和 中调用它-[UIViewController traitCollectionDidChange:]。
在这种方法中,我不建议检查主机设备是否是iPad。您特别希望查看活动特征集合的horizontalSizeClass&verticalSizeClass属性来确定布局约束的值。
有关更多信息,我建议您阅读以下文档:
1. https://developer.apple.com/documentation/uikit/uitraitcollection?language=objc
2. https://developer.apple.com/documentation/uikit/ uitraitenvironment/1623516-traitcollectiondidchange?语言=objc
第二个链接有一个简单的示例,说明如何检查是否需要更新约束。