UILabel的字體大小根據(jù)機型自動適配

1、引言

由于公司產(chǎn)品經(jīng)理提出的需求,說不同機型下的字體變化不怎么明顯,尤其是iPhone 5s,字體比較大,固定的控件大小、位置就顯得比較擁擠;其他機型則還好,顯示比較正常。

2、效果

圖1

3、方案

1、分純代碼和XIB/SB

1.純代碼

//初始化
- (void)viewDidLoad {
    [super viewDidLoad];
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 25)];
    label.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2-100);
    CGFloat multiple = [self fontMultiple];
    label.font = [UIFont systemFontOfSize:17.0*multiple];
    label.text = @"①自動適配文字大小";
    label.textAlignment = NSTextAlignmentCenter;
    label.textColor = [UIColor blackColor];
    [self.view addSubview:label];
}
//倍數(shù)
- (CGFloat)fontMultiple
{
    CGFloat width = [UIScreen mainScreen].bounds.size.width;
    if (width == 320) {
        return FONT_IPHONE_5S;//0.7
    }
    else if (width == 375) {
        return FONT_IPHONE_6;//1.0
    }
    else if (width == 414) {
        return FONT_IPHONE_6P;//1.3
    }
    else {
        return FONT_IPHONE_OTHER;//1.1
    }
}

2.XIB/SB


圖2
- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    if (IS_IPHONE_5) {
        _textLabel.font = [UIFont systemFontOfSize:12];
    }
    //XIB/SB中默認設(shè)置就是6和6p的文字大小
    if (IS_iPhoneX) {
        _textLabel.font = [UIFont systemFontOfSize:13];
    }
}
2、使用分類+runtime交換方法實現(xiàn)

關(guān)于runtime的具體實戰(zhàn)請?zhí)D(zhuǎn):傳送門
1.UIFont

+ (void)load
{
    [self exchangeMethod:@selector(systemFontOfSize:) with:@selector(SY_systemFontOfSize:)];
}

+ (UIFont *)SY_systemFontOfSize:(CGFloat)fontSize
{
    //這里并不是循環(huán)調(diào)用,+load里已經(jīng)把這方法與系統(tǒng)的方法交換了,因此這里調(diào)用的是系統(tǒng)方法
    CGFloat multiple = [self fontMultiple];
    UIFont *font = [self SY_systemFontOfSize:fontSize*multiple];
    return font;
}

+ (CGFloat)fontMultiple
{
    CGFloat width = [UIScreen mainScreen].bounds.size.width;
    if (width == 320) {
        return FONT_IPHONE_5S;
    }
    else if (width == 375) {
        return FONT_IPHONE_6;
    }
    else if (width == 414) {
        return FONT_IPHONE_6P;
    }
    else {
        return FONT_IPHONE_OTHER;
    }
}

+ (BOOL)exchangeMethod:(SEL)systemSel with:(SEL)newSel
{
    Class class = object_getClass(self);
    Method originalMethod = class_getInstanceMethod(class, systemSel);
    Method newMethod = class_getInstanceMethod(class, newSel);
    if (!originalMethod || !newMethod) return NO;
    method_exchangeImplementations(originalMethod, newMethod);
    return YES;
}

2.UILabel

+ (void)load
{
    [[self class] exchangeMethod:@selector(initWithCoder:) with:@selector(SY_initWithCoder:)];
}

- (id)SY_initWithCoder:(NSCoder *)coder
{
    [self SY_initWithCoder:coder];
    
    CGFloat fontSize = self.font.pointSize;
    self.font = [UIFont systemFontOfSize: fontSize];
    
    return self;
}

+ (BOOL)exchangeMethod:(SEL)systemSel with:(SEL)newSel
{
    Method originalMethod = class_getInstanceMethod(self, systemSel);
    Method newMethod = class_getInstanceMethod(self, newSel);
    if (!originalMethod || !newMethod) return NO;
    
    class_addMethod(self,
                    systemSel,
                    class_getMethodImplementation(self, systemSel),
                    method_getTypeEncoding(originalMethod));
    class_addMethod(self,
                    newSel,
                    class_getMethodImplementation(self, newSel),
                    method_getTypeEncoding(newMethod));
    
    method_exchangeImplementations(class_getInstanceMethod(self, systemSel),
                                   class_getInstanceMethod(self, newSel));
    return YES;
}
3、兩種方案的對比

雖然實現(xiàn)的結(jié)果都一樣,但很明顯,第二種方案是最好的,因為只要在項目中加入這兩個分類,就可以實現(xiàn)所有的(無論純代碼還是XIB/SB)label文字根據(jù)屏幕自動適配。第一種方案,在純代碼下可以使用,但XIB文件很多的話,就非常的麻煩。

4、Demo下載

gitub下載鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 場景描述 如果在你的工程代碼已經(jīng)寫好了,面臨交貨,突然這個時候產(chǎn)品說,要讓6和6P的字體大小不一樣...233這個...
    NotFunGuy閱讀 1,629評論 2 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,733評論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,036評論 4 61
  • 突然熱血沸騰,很想寫點兒什么,好表示“我思,故我在”。 碰巧朋友圈有朋友分享了一篇有關(guān)讀書的文章,順手點開來瞅了瞅...
    光芒萬丈的遠方閱讀 247評論 4 1
  • 家人們,晚上好! 今天和大家分享一位老教師總結(jié)的13條家庭教育精華: 一個優(yōu)秀孩子的背后往往有一個成功的家庭,一個...
    趙誠彬閱讀 239評論 0 1

友情鏈接更多精彩內(nèi)容