不同设备的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()
- iOS滚动视图,容器视图 – 自动布局问题
- AutoLayout和UILabel调整animation在设备旋转时无法正常工作
- 如果将UICollectionViewCell子类的contentView.translatesAutoResizingMaskToConstraints设置为“false”?
- 通过自动布局在UIScrollView中使用顶层布局指南
- 只在iPhone中查看不显示在iPad中
- animation时无法同时满足约束条件
- 带有Interface Builder的iOS8自动调整静态TableView单元格
- 使用Autolay的UIScrollViewdynamicUILabel高度
- 在UITableViewCell中加载UIView的Nib文件不能拉伸