iOS字体大小适配
方案一
#import "UIFont+runtime.h"
#import
#define UI_SCREEN375 // UI设计原型图的手机尺寸宽度(6), 6p的--414
@implementation UIFont (runtime)
+ (void)load {
// 获取替换后的类方法
Method newMethod1 = class_getClassMethod([self class], @selector(adjustSystemFontOfSize:));
// 获取替换前的类方法
Method method1 = class_getClassMethod([self class], @selector(systemFontOfSize:));
// 然后交换类方法,交换两个方法的IMP指针,(IMP代表了方法的具体的实现)
method_exchangeImplementations(newMethod1, method1);
// 获取替换后的类方法
Method newMethod2 = class_getClassMethod([self class], @selector(adjustFontWithName:size:));
// 获取替换前的类方法
Method method2 = class_getClassMethod([self class], @selector(fontWithName:size:));
// 然后交换类方法,交换两个方法的IMP指针,(IMP代表了方法的具体的实现)
method_exchangeImplementations(newMethod2, method2);
// 获取替换后的类方法
Method newMethod3 = class_getClassMethod([self class], @selector(adjustSystemFontOfSize:weight:));
// 获取替换前的类方法
Method method3 = class_getClassMethod([self class], @selector(systemFontOfSize:weight:));
// 然后交换类方法,交换两个方法的IMP指针,(IMP代表了方法的具体的实现)
method_exchangeImplementations(newMethod3, method3);
// 获取替换后的类方法
Method newMethod4 = class_getClassMethod([self class], @selector(adjustBoldSystemFontOfSize:));
// 获取替换前的类方法
Method method4 = class_getClassMethod([self class], @selector(boldSystemFontOfSize:));
// 然后交换类方法,交换两个方法的IMP指针,(IMP代表了方法的具体的实现)
method_exchangeImplementations(newMethod4, method4);
// 获取替换后的类方法
Method newMethod5 = class_getClassMethod([self class], @selector(adjustItalicSystemFontOfSize:));
// 获取替换前的类方法
Method method5 = class_getClassMethod([self class], @selector(italicSystemFontOfSize:));
// 然后交换类方法,交换两个方法的IMP指针,(IMP代表了方法的具体的实现)
method_exchangeImplementations(newMethod5, method5);
/*容易让UIAlertController变形
// 获取替换后的类方法
Method newMethod6 = class_getClassMethod([self class], @selector(adjustFontWithDescriptor:size:));
// 获取替换前的类方法
Method method6 = class_getClassMethod([self class], @selector(fontWithDescriptor:size:));
// 然后交换类方法,交换两个方法的IMP指针,(IMP代表了方法的具体的实现)
method_exchangeImplementations(newMethod6, method6);
*/
}+ (UIFont *)adjustSystemFontOfSize:(CGFloat)fontSize {
UIFont *newFont = nil;
newFont = [UIFont adjustSystemFontOfSize:[UIFont adjustFontSize:fontSize]];
return newFont;
}
+ (UIFont *)adjustFontWithName:(NSString *)name size:(CGFloat)fontSize{
UIFont *newFont = nil;
newFont = [UIFont adjustFontWithName:name size:[UIFont adjustFontSize:fontSize]];
return newFont;
}
+ (UIFont *)adjustSystemFontOfSize:(CGFloat)fontSize weight:(UIFontWeight)weight{
UIFont *newFont = nil;
newFont = [UIFont adjustSystemFontOfSize:[UIFont adjustFontSize:fontSize]];
return newFont;
}
+ (UIFont *)adjustBoldSystemFontOfSize:(CGFloat)fontSize{
UIFont *newFont = nil;
newFont = [UIFont adjustBoldSystemFontOfSize:[UIFont adjustFontSize:fontSize]];
return newFont;
}
+ (UIFont *)adjustItalicSystemFontOfSize:(CGFloat)fontSize{
UIFont *newFont = nil;
newFont = [UIFont adjustItalicSystemFontOfSize:[UIFont adjustFontSize:fontSize]];
return newFont;
}+ (UIFont *)adjustFontWithDescriptor:(UIFontDescriptor *)descriptor size:(CGFloat)fontSize{
UIFont *newFont = nil;
newFont = [UIFont adjustFontWithDescriptor:descriptor size:[UIFont adjustFontSize:fontSize]];
return newFont;
}
+ (CGFloat)adjustFontSize:(CGFloat)fontSize{
return fontSize * [UIScreen mainScreen].bounds.size.width / UI_SCREEN;
}
@end
方案二 【iOS字体大小适配】方案一中,如果使用地图之类,会产生字体超出控件的情况。
不妨在UIFont中用比例因子来做字体大小的适配。
UIFont.systemFont(ofSize: ConstUtil.fontScale(fontSize: 14), weight: .medium)
struct ConstUtil{
/// 屏幕的宽
static let winWidth = UIScreen.main.bounds.size.width
/// 屏幕的高
static let winHeight = UIScreen.main.bounds.size.height
/// 缩放大小
static var winScale: CGFloat{
if winWidth == 320 {
return 0.853
}
if winWidth == 414{
return 1.104
}
return 1
}
/// 文字缩放
static func fontScale(fontSize:CGFloat)->CGFloat{
return fontSize * ConstUtil.winScale
}
}
推荐阅读
- 2020-04-07vue中Axios的封装和API接口的管理
- iOS中的Block
- 使用协程爬取网页,计算网页数据大小
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- 2019-08-29|2019-08-29 iOS13适配那点事
- Hacking|Hacking with iOS: SwiftUI Edition - SnowSeeker 项目(一)
- iOS面试题--基础
- 怎么压缩图片大小不影响质量
- 接口|axios接口报错-参数类型错误解决
- iOS|iOS 笔记之_时间戳 + DES 加密