如何为不同的屏幕尺寸设置不同的自动布局约束

How to set up different Auto Layout constraints for different screen sizes

我有一个带有静态单元格的 tableView。该单元格包含一个完全填充它的 ImageView。我在上面还有另一个较小的 ImageView。我将此 ImageViews 放置在约束条件下。我有一个关于调整约束的问题。 如何在不编程 if/else 循环的情况下为不同的设备尺寸设置不同的约束常量。有没有办法在情节提要中设置它?例如,我对父布局有一个前导约束,其常量值为 10。这对于 iPhone 5 屏幕是可以的,但在 iPhone 6/ 6 plus 屏幕上它应该高于 10。

iPhone5 自动布局

iPhone6 自动布局

很简单。您可以在 Storyboard 中更改不同大小 classes 的常量值。我给你几个步骤,之后你就可以掌握它了。

首先我们创建常量,如您在此视图中所见

接下来我们 select 我们要更改其他大小的值的常量 classes.

棘手的部分来了。在 selecting 常量后的属性检查器中,您可以看到常量的值。在你旁边可以看到 PLUS (+) 标志,在 "constant".

左边

单击它并 select 您想要的尺码 class。 这里我有 selected 常规高度常规宽度即 iPad 尺寸。

接下来我们给它一个新的值。因此,通常值为 61 的常量在以 iPad 大小 classes.

的大小 class 呈现时将作为 10

这是输出--

iPhone 4:

iPad空气:

如您所见,相同的常量在运行时具有不同的值,对应于不同的大小classes。

希望我的解释对你有所帮助。

最后,我找到了适用于我的情况的解决方案。

  1. 我将透明视图添加到 Superview(背景图像)的对齐中心 X/Y,并以适合我的海报框架(在背景图像上)的方式进行所需的偏移- Constraints for the transparent view
  2. 然后我将 Equal width/height 附加到我的透明视图的 Superview(背景图像)并更改等宽的乘数(我手动选择 0.61)
  3. 在那之后,我得到了我的 1 张海报。我还使用偏移量在垂直和水平方向居中并使用了这组约束 - 与 Superview 成比例的宽度,纵横比。
  4. 最后我用这个约束处理了我的第二张海报 - 引导 space 到 Poster1,将 CenterY 对齐到 Poster1(在我的例子中有偏移量)和等于 width/height。 Constraints for the Poster 1/2

因此,我拥有真正自适应的自动布局,它在 iPhone 5-6-6+ 上几乎可以正常工作

不写一行代码!

有一次我的初级开发人员问我同样的问题,即我如何区分 iPhoneSE 和 iPhone6 以解决当时的某些限制,只有一个解决方案正在编写类似

的内容
if device == iPhoneSE { 
   constant = 44 
} else if device == iPhone6 {
   constant = 52
}

为了克服这个问题,我创建了一个库 Layout Helper 因此现在您无需编写一行代码就可以更新每个设备的约束。

第 1 步

将 NSLayoutHelper 分配给您的约束

第 2 步

更新所需设备的约束条件

步骤 3

运行 应用程序并查看 MAGIC

您可以使用 BayKit 完成这项工作。

什么是 BayKit:

Calculates the global offset for all screen sizes by depending on given screen size and given offset.

如何使用BayKit: 使用非常简单,只需导入 BayKit 并使用 BayKit 设置常量值,如下所示:

import BayKit

class MyViewController: UIViewController {
lazy var box = UIView()
let magicOffset = BayKit()

override func viewDidLoad() {
    super.viewDidLoad()
    view.addSubview(box)
    box.translatesAutoresizingMaskIntoConstraints = false

    box.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: magicOffset.offseter(scaleFactor: 1.0,
    offset: 24, direction: .horizontal, currentDeviceBound: BayKit.DeviceList.iPhone5.screenWidth)).isActive = true
}
}

如您所见,此行计算所有屏幕尺寸的偏移量:

magicOffset.offseter(scaleFactor: 1.0, offset: 24, direction: .horizontal, currentDeviceBound: BayKit.DeviceList.iPhone5.screenWidth)

偏移器特点:

  • scaleFactor: 如果你想要比给定的偏移量更大或更小,你可以设置(默认设置为 1.0)。
  • 偏移量: 测试设备中的首选常数。
  • 方向:你要找哪个方向,即(对于宽度、前导、尾随使用 .horizo​​ntal,对于高度、顶部、底部使用 .vertical)
  • currentDeviceBound: 找到您最适合的设备并以此设置为主设备。 BayKit 将根据您最适合的屏幕计算约束条件!

示例结果: