不同设备的iOS大小不同的字体大小

在iOS 8中,我们可以为每个尺寸类别devise不同的UI布局。 我面临的问题是,我已经devise了紧凑宽度和规则高度(纵向所有iPhone的尺寸等级)的布局,但我想保留3.5和4英寸设备(iPhone 4和5)的标签更小的字体大小),4.7英寸(iPhone 6)相对较大,5.5英寸(iPhone 6 Plus)设备更大。 我已经search,但无法find一个解决scheme,以设置相同的大小类不同的设备不同的字体大小。

自动布局和大小类不针对特定的屏幕尺寸,因为它们不是为此而devise的。 苹果不希望你的目标设备,以帮助您更好地维护您的代码。

说一个新的iPhone模型出来,如果你正在使用自动布局和大小类,你不必手动修复所有的约束,使您的应用程序兼容这个较新的设备。 但是,您仍然可以使用以下代码设置UILabel的字体大小:

 if UIScreen.mainScreen().bounds.size.height == 480 { // iPhone 4 label.font = label.font.fontWithSize(20) } else if UIScreen.mainScreen().bounds.size.height == 568 { // IPhone 5 label.font = label.font.fontWithSize(20) } else if UIScreen.mainScreen().bounds.size.width == 375 { // iPhone 6 label.font = label.font.fontWithSize(20) } else if UIScreen.mainScreen().bounds.size.width == 414 { // iPhone 6+ label.font = label.font.fontWithSize(20) } else if UIScreen.mainScreen().bounds.size.width == 768 { // iPad label.font = label.font.fontWithSize(20) } 

我正在使用UILabel自定义类UILabel扩展UIDevice扩展作为通用解决scheme在Swift 3及以上的项目中处理它。

用于获取screenType UIDevice扩展

 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扩展中 ,使它可以从所有types的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的实例进行子类化,其字体大小需要根据设备大小进行调整。

你可以达到如下效果。

Usage : 不用14作为字体大小, 你可以使用14.fontSize ,它会根据设备而改变,取决于你的增量值。

无需在代码中添加任何条件。 只有一次如下。

用法: UIFont.font_medium(12.fontSize)

UIFont扩展:

 extension UIFont { class func font_medium(_ size : CGFloat) -> UIFont { return UIFont(name: "EncodeSans-Medium", size: size)!; } } 

UIDevice扩展:

 extension UIDevice { enum DeviceTypes { case iPhone4_4s case iPhone5_5s case iPhone6_6s case iPhone6p_6ps case after_iPhone6p_6ps } static var deviceType : DeviceTypes { switch UIScreen.main.height { case 480.0: return .iPhone4_4s case 568.0: return .iPhone5_5s case 667.0: return .iPhone6_6s case 736.0: return .iPhone6p_6ps default: return .after_iPhone6p_6ps } } } 

内部扩展:

 extension Int{ var fontSize : CGFloat { var deltaSize : CGFloat = 0; switch (UIDevice.deviceType) { case .iPhone4_4s, .iPhone5_5s : deltaSize = -1; case .iPhone6_6s : deltaSize = 2; case .iPhone6p_6ps : deltaSize = 2; default: deltaSize = 0; } let selfValue = self; return CGFloat(selfValue) + deltaSize; } } 

两种方式:

1)在app委托中手工制作一个方法,分享它的对象和调用方法。

例如:

  var device = UIDevice.currentDevice().model if (device == "iPhone" || device == "iPhone Simulator" || device == "iPod touch") { labelboarder.frame = CGRectMake(0,self.usernameTF.frame.height-10, self.usernameTF.frame.width, 1) labelboarder1.frame = CGRectMake(0,self.usernameTF.frame.height-10, self.usernameTF.frame.width,1) } else { labelboarder.frame = CGRectMake(0,self.usernameTF.frame.height, 500, 1) labelboarder1.frame = CGRectMake(0,self.usernameTF.frame.height, 500,1) } 

2)在每个UI项目上,转到属性检查器,声明字体。

(在字体大小字段的左边有一个+符号,点击它,select匹配的大小类并声明字体大小。)

第二个选项对我来说很方便。 快乐编码!

不要为每个标签编写代码,只要使用下面的自定义标签类扩展标签类,它将根据设备分辨率比例因子自动缩放:

 #define SCALE_FACTOR_H ( [UIScreen mainScreen].bounds.size.height / 568 ) CustomLabel.h #import <UIKit/UIKit.h> @interface CustomLabel : UILabel @end CustomLabel.m #import "CustomLabel.h" @implementation CustomLabel /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */ - (id)initWithCoder:(NSCoder *)aDecoder { if( (self = [super initWithCoder:aDecoder]) ){ [self layoutIfNeeded]; [self configurefont]; } return self; } - (void) configurefont { CGFloat newFontSize = (self.font.pointSize * SCALE_FACTOR_H); self.font = [UIFont fontWithName:self.font.fontName size:newFontSize]; } @end 

像这样创build,

 #define VIEWHEIGHT ([[UIScreen mainScreen] bounds].size.height) #define VIEWWIDTH ([[UIScreen mainScreen] bounds].size.width) #define FONTNAME_LIGHT @"AppleSDGothicNeo-Regular" #define FONTNAME_BOLD @"AppleSDGothicNeo-Bold" #define LFONT_16 [UIFont fontWithName:FONTNAME_LIGHT size:16] 

在那之后你想改变标签字体,我们可以写简单的开关盒

 switch ((VIEWHEIGHT == 568)?1:((VIEWHEIGHT == 667)?2:3)) { case 1:{ boldFont = BFONT_16; } break; case 2:{ privacyFont = LFONT_18; boldFont = BFONT_18; } break; default:{ privacyFont = LFONT_20; boldFont = BFONT_20; } break; } 

这就是我如何做到这一点。 这是写在Swift 4 🙂

 enum DeviceSize { case big, medium, small } protocol Fontadjustable { var devicetype: DeviceSize { get } func adjustFontSizeForDevice() } extension UILabel: Fontadjustable { var devicetype: DeviceSize { switch UIScreen.main.nativeBounds.height { case 1136: return .small case 1334: return .medium case 2208: return .big case 2436: return .big default: return .big } } func adjustFontSizeForDevice() { switch self.devicetype { case .small: self.font = font.withSize(font.pointSize) case .medium: self.font = font.withSize(font.pointSize + 5) case .big: self.font = font.withSize(font.pointSize + 10) } } } 

用法: myawesomeLabel.adjustFontSizeForDevice()