- 1、字体适配思路
写个UIFont(category),在category里面重写+(void)load方法,采用method_exchangeImplementations 进行方法替换,具体代码如下操作:
///自定义字体,缩放等相关适配信息
+ (UIFont *)custom_systemFontOfSize:(CGFloat)fontSize{
//获取设备屏幕宽度,并计算出比例scale
CGFloat width = [[UIScreen mainScreen] bounds].size.width;
CGFloat scale = width/375.0;
//注意:系统的方法名已变成了自定义的方法名
return [UIFont custom_systemFontOfSize:fontSize * scale];
}
//重写
+ (void)load{
//获取系统方法
Method sytemMethod = class_getClassMethod([UIFont class], @selector(systemFontOfSize:));
//获取自定义方法
Method customMethod = class_getClassMethod([UIFont class], @selector(custom_systemFontOfSize:));
//交换
method_exchangeImplementations(sytemMethod, customMethod);
}
2、制作比较细腻的引导层,一般引导层,直接在window上加个UIView搞就完事了,做好适配就行
新增category,通过objc_setAssociatedObject,objc_getAssociatedObject来动态添加UIView引导属性,这样可以把业务逻辑分离的比较清晰一些,需要提前设计好引导层,否则坐标位置处理麻烦
3、修改私有属性
首先定义一个测试类
///.h文件
@interface ModifyPrivateProperty : NSObject
@end
///.m文件
#import "ModifyPrivateProperty.h"
@implementation ModifyPrivateProperty
{
//私有属性
NSString *name;
}
@end
3.1 通过KVC修改私有属性值
ModifyPrivateProperty *target = [ModifyPrivateProperty new];
[target setValue:@"123" forKey:@"name"];
NSLog(@"target private name value:%@",[target valueForKey:@"name"]);
打印结果如下:
OCTest[7557:961519] target private name value:123
3.2通过Runtime修改私有属性
ModifyPrivateProperty *target = [ModifyPrivateProperty new];
unsigned int count;
Ivar *props = class_copyIvarList([target class], &count);
for (int i =0; i<count; i++) {
Ivar prop = props[i];
const char * key = ivar_getName(prop);
if (strcmp(key, "name") == 0) {
object_setIvar(target, prop, @"123");
}
}
NSLog(@"target private name value:%@",[target valueForKey:@"name"]);
打印结果如下:
OCTest[7666:983222] target private name value:123
更多精彩内容请关注公众号