iOS 不同设备的不同限制
iOS different constraints for different devices
我有一个 ViewController 专为 iPhone SE
如你所见,我也有一个约束条件Align Top to: Safe Area Equals 75
问题是,是否可以为 iPhone 8 和 iPhone 8 Plus 更改此值?例如:
- SE = 75
- 8 = 85
- 8 加 = 105
不使用 Interface Builder,不。限制条件,只能针对紧凑、常规或任意尺寸,所有 iPhone 模型在纵向模式下都具有紧凑宽度和常规高度。
如果您想要这种粒度,则必须改用代码。
这在 IB 中不适用,您可以在代码中尝试将视图的顶部约束挂接到 IBOutlet 并在 viewDidLayoutSubviews 中尝试
override func viewDidLayoutSubviews()
{
if(deviceWidthSE)
{
self.viewTopCon.constant = 75
}
else
if(deviceWidth8)
{
self.viewTopCon.constant = 85
}
else
if(deviceWidth8Plus)
{
self.viewTopCon.constant = 105
}
}
我们遇到了类似的问题。我们用名为 scaled 的助手 class 解决了问题。这基本上只是乘以某些东西的大小,它应该在更大的设备上显得更大。
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
}
}
以及在应用中的使用
fileprivate let footerHeight = CGFloat(180).scaled
简单的方法!
为了解决这个问题,我创建了一个小的 library,所以你不必编写一行代码,只需将 class (NSLayoutHelper) 分配给你的约束,你就会能够以不同方式更新所有设备的约束条件。
用于更新约束
输出
我有一个 ViewController 专为 iPhone SE
如你所见,我也有一个约束条件Align Top to: Safe Area Equals 75
问题是,是否可以为 iPhone 8 和 iPhone 8 Plus 更改此值?例如:
- SE = 75
- 8 = 85
- 8 加 = 105
不使用 Interface Builder,不。限制条件,只能针对紧凑、常规或任意尺寸,所有 iPhone 模型在纵向模式下都具有紧凑宽度和常规高度。
如果您想要这种粒度,则必须改用代码。
这在 IB 中不适用,您可以在代码中尝试将视图的顶部约束挂接到 IBOutlet 并在 viewDidLayoutSubviews 中尝试
override func viewDidLayoutSubviews()
{
if(deviceWidthSE)
{
self.viewTopCon.constant = 75
}
else
if(deviceWidth8)
{
self.viewTopCon.constant = 85
}
else
if(deviceWidth8Plus)
{
self.viewTopCon.constant = 105
}
}
我们遇到了类似的问题。我们用名为 scaled 的助手 class 解决了问题。这基本上只是乘以某些东西的大小,它应该在更大的设备上显得更大。
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
}
}
以及在应用中的使用
fileprivate let footerHeight = CGFloat(180).scaled
简单的方法!
为了解决这个问题,我创建了一个小的 library,所以你不必编写一行代码,只需将 class (NSLayoutHelper) 分配给你的约束,你就会能够以不同方式更新所有设备的约束条件。
用于更新约束
输出