如何为不同设备自动布局应用程序。

How to auto layout an app for different devices.

提前对这个问题的基本性质表示歉意。我很高兴被重定向到这个问题的先前回答版本,但还没有找到它。

我刚刚完成了我的第一个应用程序的大部分,我担心我可能以错误的方式设置了它。

我的应用在 iphone7 上看起来 "good",但是当我将设备更改为 7+ 时,视图控制器的底部和右侧边缘是空的 space,当我 运行 它在 iphone 5 上时,视图不适合。

有没有办法让我的应用在任何设备上自动显示 stretch/condense?或者,这种方式是否比我预期的更复杂?我想相信有一个简单的解决方案,但我还没有找到它。

谢谢!

好的,这对您来说将是一项漫长的任务。我将列出您需要学习的主题,以便正确处理。

  1. 堆栈视图
  2. 内容拥抱优先级/抗压缩优先级
  3. 约束优先级
  4. 不同 UI 元素的大小 类

有用链接:

  1. 关于Autolayout的一些奥秘的官方教程(Part 1 and Part 2)。
  2. Autolayout 官方 Guide
  3. 其他在线资源

as rightly mentioned by J. Doe, The answer is in your question

如果您只支持纵向模式那么。

  1. 首先为您选择的 design.As 选择一个基本布局 iphone 7. 我选择iphone7+

  2. 创建一些常量。

为什么?

要创建一个宽高比与您在 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
}

如果你支持横向模式

  1. 如果你想改变横向布局,那么你需要为 landscape.As 设计你的大部分网点,你只需要改变左上右下约束。所以在那种情况下,卸载以前的约束并安装另一个约束并使其仅在大小class.
  2. 下工作

网上有很多关于自适应布局的教程like this.

  1. 如果你不想改变布局,而是根据纵横比适当计算,那么有一个在定位时触发的功能。

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator 协调器: UIViewControllerTransitionCoordinator) { 如果 UIDevice.currentDevice().orientation.isLandscape.boolValue { 打印("Landscape") imageView.image = UIImage(命名为:const2) } 别的 { 打印("Portrait") imageView.image = UIImage(命名为:常量) } }

在该函数中应用逻辑以支持所有设备:)