iOS对不同设备的不同约束

时间:2018-02-06 20:03:05

标签: ios xcode size-classes

我有一个专为iPhone SE设计的ViewController

enter image description here

如您所见,我也有约束Align Top to: Safe Area Equals 75

问题是,是否可以更改iPhone 8和iPhone 8 Plus的此值?例如:

  • SE = 75
  • 8 = 85
  • 8 Plus = 105

4 个答案:

答案 0 :(得分:6)

不使用Interface Builder,没有。限制,只能以Compact,Regular或Any尺寸为目标,所有iPhone型号在纵向模式下都具有紧凑宽度和常规高度。

如果您想要这种粒度,则必须使用代码来实现。

答案 1 :(得分:3)

我们面临着类似的问题。我们用称为缩放的辅助类解决了。这基本上只是增加某些东西的大小,在较大的设备上应该显得更大。

extension CGFloat {
    public var scaled: CGFloat {
        switch UIDevice.type.getResolutionGroup()! {
        case .lr320x568:
            return self
        case .lr375x667:
            return self * 1.1
        case .lr414x736:
            return self * 1.2
        case .lr768x1024:
            return self * 1.3
        // For iPads
        case .lr1024x1366:
            return self * 1.3
        }
    }
}

决议小组的实施

public func getResolutionGroup() -> ResolutionGroup? {
        switch self {
        case .iPhone5, .iPhone5C, .iPhone5S, .iPhoneSE, .iPodTouch5, .iPodTouch6:
            return .lr320x568
        case .iPhone6, .iPhone6S, .iPhone7:
            return .lr375x667
        case .iPhone6Plus, .iPhone6SPlus, .iPhone7Plus:
            return .lr414x736
        case .iPadMini, .iPadMini2, .iPadMini3, .iPadMini4:
            return .lr768x1024
        case .iPad2, .iPad3, .iPad4, .iPadAir, .iPadAir2:
            return .lr768x1024
        case .iPadPro:
            return .lr1024x1366
        case .simulator:
            return isiPhone() ? .lr320x568 : .lr768x1024
        default:
            return .lr320x568
        }
    }

在app中使用

fileprivate let footerHeight = CGFloat(180).scaled

答案 2 :(得分:2)

简便!

为解决此问题,我创建了一个小的library,因此您不必编写任何代码,只需将类(NSLayoutHelper)分配给您的约束即可,您可以为所有设备都不同。

enter image description here

用于更新约束

enter image description here

输出

enter image description here

答案 3 :(得分:1)

这不是IB中的应用程序,您可以通过将视图的顶部约束挂钩为IBOutlet并在viewDidLayoutSubviews中尝试代码

{{1}}