如何为不同设备自动布局应用程序。
How to auto layout an app for different devices.
提前对这个问题的基本性质表示歉意。我很高兴被重定向到这个问题的先前回答版本,但还没有找到它。
我刚刚完成了我的第一个应用程序的大部分,我担心我可能以错误的方式设置了它。
我的应用在 iphone7 上看起来 "good",但是当我将设备更改为 7+ 时,视图控制器的底部和右侧边缘是空的 space,当我 运行 它在 iphone 5 上时,视图不适合。
有没有办法让我的应用在任何设备上自动显示 stretch/condense?或者,这种方式是否比我预期的更复杂?我想相信有一个简单的解决方案,但我还没有找到它。
谢谢!
好的,这对您来说将是一项漫长的任务。我将列出您需要学习的主题,以便正确处理。
- 堆栈视图
- 内容拥抱优先级/抗压缩优先级
- 约束优先级
- 不同 UI 元素的大小 类
有用链接:
as rightly mentioned by J. Doe, The answer is in your question
如果您只支持纵向模式那么。
首先为您选择的 design.As 选择一个基本布局 iphone 7.
我选择iphone7+
创建一些常量。
为什么?
要创建一个宽高比与您在 iphone 7 layout.so 中绘制的每个约束的常量值相乘,它将根据设备正确计算。
像这样。
var SCREEN_WIDTH = UIScreen.main.bounds.size.width
var SCREEN_HEIGHT = UIScreen.main.bounds.size.height
var BASE_SCREEN_HEIGHT:CGFloat = 736.0
var SCREEN_MAX_LENGTH = max(SCREEN_WIDTH, SCREEN_HEIGHT)
var ASPECT_RATIO_RESPECT_OF_7P = SCREEN_MAX_LENGTH / BASE_SCREEN_HEIGHT
你也可以用我的。如果您的基本布局是 iphone 7Plus.
这个怎么用?
假设您为 iphone 7 plus 中的标签绘制一个大约 10 的顶部约束。
然后做一个函数,像这样在viewDidLoad中调用它,支持所有纵向模式的设备。
func updateConstraint() {
topConstantOfYourLabel.constant = 10*ASPECT_RATIO_RESPECT_OF_7P
}
如果你支持横向模式
- 如果你想改变横向布局,那么你需要为 landscape.As 设计你的大部分网点,你只需要改变左上右下约束。所以在那种情况下,卸载以前的约束并安装另一个约束并使其仅在大小class.
下工作
网上有很多关于自适应布局的教程like this.
如果你不想改变布局,而是根据纵横比适当计算,那么有一个在定位时触发的功能。
override func viewWillTransitionToSize(size: CGSize,
withTransitionCoordinator 协调器:
UIViewControllerTransitionCoordinator) {
如果 UIDevice.currentDevice().orientation.isLandscape.boolValue {
打印("Landscape")
imageView.image = UIImage(命名为:const2)
} 别的 {
打印("Portrait")
imageView.image = UIImage(命名为:常量)
}
}
在该函数中应用逻辑以支持所有设备:)
提前对这个问题的基本性质表示歉意。我很高兴被重定向到这个问题的先前回答版本,但还没有找到它。
我刚刚完成了我的第一个应用程序的大部分,我担心我可能以错误的方式设置了它。
我的应用在 iphone7 上看起来 "good",但是当我将设备更改为 7+ 时,视图控制器的底部和右侧边缘是空的 space,当我 运行 它在 iphone 5 上时,视图不适合。
有没有办法让我的应用在任何设备上自动显示 stretch/condense?或者,这种方式是否比我预期的更复杂?我想相信有一个简单的解决方案,但我还没有找到它。
谢谢!
好的,这对您来说将是一项漫长的任务。我将列出您需要学习的主题,以便正确处理。
- 堆栈视图
- 内容拥抱优先级/抗压缩优先级
- 约束优先级
- 不同 UI 元素的大小 类
有用链接:
as rightly mentioned by J. Doe, The answer is in your question
如果您只支持纵向模式那么。
首先为您选择的 design.As 选择一个基本布局 iphone 7. 我选择iphone7+
创建一些常量。
为什么?
要创建一个宽高比与您在 iphone 7 layout.so 中绘制的每个约束的常量值相乘,它将根据设备正确计算。
像这样。
var SCREEN_WIDTH = UIScreen.main.bounds.size.width
var SCREEN_HEIGHT = UIScreen.main.bounds.size.height
var BASE_SCREEN_HEIGHT:CGFloat = 736.0
var SCREEN_MAX_LENGTH = max(SCREEN_WIDTH, SCREEN_HEIGHT)
var ASPECT_RATIO_RESPECT_OF_7P = SCREEN_MAX_LENGTH / BASE_SCREEN_HEIGHT
你也可以用我的。如果您的基本布局是 iphone 7Plus.
这个怎么用?
假设您为 iphone 7 plus 中的标签绘制一个大约 10 的顶部约束。 然后做一个函数,像这样在viewDidLoad中调用它,支持所有纵向模式的设备。
func updateConstraint() {
topConstantOfYourLabel.constant = 10*ASPECT_RATIO_RESPECT_OF_7P
}
如果你支持横向模式
- 如果你想改变横向布局,那么你需要为 landscape.As 设计你的大部分网点,你只需要改变左上右下约束。所以在那种情况下,卸载以前的约束并安装另一个约束并使其仅在大小class. 下工作
网上有很多关于自适应布局的教程like this.
如果你不想改变布局,而是根据纵横比适当计算,那么有一个在定位时触发的功能。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator 协调器: UIViewControllerTransitionCoordinator) { 如果 UIDevice.currentDevice().orientation.isLandscape.boolValue { 打印("Landscape") imageView.image = UIImage(命名为:const2) } 别的 { 打印("Portrait") imageView.image = UIImage(命名为:常量) } }
在该函数中应用逻辑以支持所有设备:)