我在 Swift 3+ 的项目中使用 UILabel 自定义类、UILabel 扩展 和 UIDevice 处理它扩展 作为通用解决方案。
UIDevice 扩展获取screenType:
public extension UIDevice {
var iPhone: Bool {
return UIDevice().userInterfaceIdiom == .phone
}
enum ScreenType: String {
case iPhone4
case iPhone5
case iPhone6
case iPhone6Plus
case iPhoneX
case Unknown
}
var screenType: ScreenType {
guard iPhone else { return .Unknown}
switch UIScreen.main.nativeBounds.height {
case 960:
return .iPhone4
case 1136:
return .iPhone5
case 1334:
return .iPhone6
case 2208:
return .iPhone6Plus
case 2436:
return .iPhoneX
default:
return .Unknown
}
}
}
以下是使用screenType 调整字体大小的UILabel 扩展。 adjustsFontSizeToFitDevice 方法也可以添加到 UILabel 自定义类 中,但我已将它放在 UILabel 扩展 中以使其可从所有类型的 UILabel 实例中访问。
adjustsFontSizeToFitDevice 方法中使用的常量“2”可以更改为任何所需的数字。我的逻辑是将 iPhone 6/7/8 视为默认分辨率,并为该分辨率的每个标签提供合适的字体大小(在 Storyboard 中)。然后,我为 iPhone X 和 iPhone 6/7/8 Plus 加 2 分,而为 iPhone 4/5 减 2 分。
extension UILabel {
func adjustsFontSizeToFitDevice() {
switch UIDevice().screenType {
case .iPhone4, .iPhone5:
font = font.withSize(font.pointSize - 2)
break
case .iPhone6Plus, .iPhoneX:
font = font.withSize(font.pointSize + 2)
break
default:
font = font.withSize(font.pointSize)
}
}
}
最后是一个 UILabel 自定义类,用于对从MyCustomLabel 子类化的所有标签应用字体调整。
class MyCustomLabel: UILabel {
// MARK: - Life Cycle Methods
override func awakeFromNib() {
super.awakeFromNib()
adjustsFontSizeToFitDevice()
}
}
用法:
在 Storyboard 中,从MyCustomLabel 子类化所有需要根据设备大小调整字体大小的 UILabel 实例。