iOS字體大小適配

1堤器、改變代碼中通過接口[UIFont systemFontOfSize:]击费、[UIFont systemFontOfSize:weight:]設(shè)置的字體,其他接口設(shè)置的字體可自行添加。建議項(xiàng)目中用統(tǒng)一的接口設(shè)置字體罕伯,方便適配。

2叽讳、改變xib文件中設(shè)置fitDeviceFont屬性為true的字體追他。控件包括UILabel,UIButton,UITextField,UITextView岛蚤。

其他控件可自行添加邑狸。

3、根據(jù)屏幕適配字體大小涤妒,適配公式可自行定義(當(dāng)前代碼是通過屏幕寬度比例单雾,以414屏寬為基準(zhǔn),來修改字體大小)她紫,修改[UIFont fitFontSize:]函數(shù)即可硅堆。

文件:UIFont+FitDevice.h

@interface UIFont (FitDevice)
+ (CGFloat)fitFontSize:(CGFloat)curFontSize;
@end
#import "UIFont+FitDevice.h"
#import <objc/runtime.h>

const CGFloat default_screen_width = 414.0;

@implementation UIFont (FitDevice)
+ (void)load{
    Method nm1 = class_getClassMethod([self class], @selector(fitDeviceFont:));
    Method m1 = class_getClassMethod([self class], @selector(systemFontOfSize:));
    method_exchangeImplementations(nm1, m1);
    
    Method nm2 = class_getClassMethod([self class], @selector(fitDeviceFont:weight:));
    Method m2 = class_getClassMethod([self class], @selector(systemFontOfSize:weight:));
    method_exchangeImplementations(nm2, m2);
}

+ (UIFont*)fitDeviceFont:(CGFloat)fontSize{
    CGFloat newSize = [UIFont fitFontSize:fontSize];
    UIFont* font = [UIFont fitDeviceFont:newSize];
    return  font;
}

+ (UIFont*)fitDeviceFont:(CGFloat)fontSize weight:(UIFontWeight)weight{
    CGFloat newSize = [UIFont fitFontSize:fontSize];
    UIFont* font = [UIFont fitDeviceFont:newSize weight:weight];
    return  font;
}

+ (CGFloat)fitFontSize:(CGFloat)curFontSize{
    CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
    CGFloat font_size = curFontSize*screenW/default_screen_width;
//    if (screenW > default_screen_width) {
//        font_size += 1;
//    }else {
//        font_size -= 1;
//    }
    return font_size;
}
@end

文件:UILabelExt.swift

extension UILabel{
    @IBInspectable var fitDeviceFont:Bool{
        get{
            return self.fitDeviceFont
        }
        
        set{
            if (newValue) {
                let fontAttributes = self.font.fontDescriptor.fontAttributes
                if let descriptor = changeFontAttributes(fontAttributes: fontAttributes) {
                    self.font = UIFont.init(descriptor: descriptor.0, size: descriptor.1)
                }
            }else{
                
            }
        }
    }
}

extension UIButton{
    @IBInspectable var fitDeviceFont:Bool{
        get{
            return self.fitDeviceFont
        }
        
        set{
            if (newValue) {
                if let fontAttributes = self.titleLabel?.font.fontDescriptor.fontAttributes {
                    if let descriptor = changeFontAttributes(fontAttributes: fontAttributes) {
                        self.titleLabel?.font = UIFont.init(descriptor: descriptor.0, size: descriptor.1)
                    }
                }
                
            }else{
                
            }
        }
    }
}

extension UITextField{
    @IBInspectable var fitDeviceFont:Bool{
        get{
            return self.fitDeviceFont
        }
        
        set{
            if (newValue) {
                if let fontAttributes = self.font?.fontDescriptor.fontAttributes {
                    if let descriptor = changeFontAttributes(fontAttributes: fontAttributes) {
                        self.font = UIFont.init(descriptor: descriptor.0, size: descriptor.1)
                    }
                }
                
            }else{
                
            }
        }
    }
}

extension UITextView{
    @IBInspectable var fitDeviceFont:Bool{
        get{
            return self.fitDeviceFont
        }
        
        set{
            if (newValue) {
                if let fontAttributes = self.font?.fontDescriptor.fontAttributes {
                    if let descriptor = changeFontAttributes(fontAttributes: fontAttributes) {
                        self.font = UIFont.init(descriptor: descriptor.0, size: descriptor.1)
                    }
                }
            }else{
                
            }
        }
    }
}


func changeFontAttributes(fontAttributes:[UIFontDescriptor.AttributeName : Any])->(UIFontDescriptor,CGFloat)?{
    var attributes = fontAttributes
    let font_size_num = fontAttributes[UIFontDescriptor.AttributeName.size] as? NSNumber
    let font_size = CGFloat(font_size_num?.floatValue ?? 0)
    let fit_Font_size = UIFont.fitSize(font_size)
    if font_size != fit_Font_size && fit_Font_size > 0 {
        attributes[UIFontDescriptor.AttributeName.size] = NSNumber.init(value:fit_Font_size)
        let descriptor = UIFontDescriptor.init(fontAttributes: fontAttributes)
        return (descriptor,fit_Font_size)
    }
    return nil
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贿讹,隨后出現(xiàn)的幾起案子渐逃,更是在濱河造成了極大的恐慌,老刑警劉巖围详,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朴乖,死亡現(xiàn)場離奇詭異祖屏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)买羞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門袁勺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人畜普,你說我怎么就攤上這事期丰。” “怎么了吃挑?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵钝荡,是天一觀的道長。 經(jīng)常有香客問我舶衬,道長埠通,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任逛犹,我火速辦了婚禮端辱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘虽画。我一直安慰自己舞蔽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布码撰。 她就那樣靜靜地躺著渗柿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脖岛。 梳的紋絲不亂的頭發(fā)上朵栖,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音鸡岗,去河邊找鬼混槐。 笑死,一個胖子當(dāng)著我的面吹牛轩性,可吹牛的內(nèi)容都是我干的声登。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼揣苏,長吁一口氣:“原來是場噩夢啊……” “哼悯嗓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卸察,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脯厨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坑质,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體合武,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡临梗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了稼跳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盟庞。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖汤善,靈堂內(nèi)的尸體忽然破棺而出什猖,到底是詐尸還是另有隱情,我是刑警寧澤红淡,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布不狮,位于F島的核電站,受9級特大地震影響在旱,放射性物質(zhì)發(fā)生泄漏摇零。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一桶蝎、第九天 我趴在偏房一處隱蔽的房頂上張望遂黍。 院中可真熱鬧,春花似錦俊嗽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牙捉,卻和暖如春竹揍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邪铲。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工芬位, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人带到。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓昧碉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親揽惹。 傳聞我的和親對象是個殘疾皇子被饿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • #defineMyUIScreen375//UI設(shè)計(jì)原型圖的手機(jī)尺寸寬度(6),6p的--414 UIFont+r...
    H了M閱讀 633評論 0 0
  • 一、需求背景介紹 最近在梳理項(xiàng)目是發(fā)現(xiàn)搪搏,針對xib創(chuàng)建的控件字體大小使用了runtime替換initWithCod...
    Joshua520閱讀 2,302評論 0 2
  • 方案一 方案二 方案一中狭握,如果使用地圖之類,會產(chǎn)生字體超出控件的情況疯溺。不妨在UIFont中用比例因子來做字體大小的適配论颅。
    前年的邂逅_Jerry閱讀 1,586評論 9 13
  • 在iOS開發(fā)中哎垦,有些公司對字體也有適配要求,為了讓字體美觀恃疯,所以在不同尺寸的屏幕上字體大小也要做到適配漏设。自己總結(jié)了...
    小和大大閱讀 2,841評論 4 3
  • 在iOS開發(fā)中,有些公司對字體也有適配要求澡谭,為了讓字體美觀愿题,所以在不同尺寸的屏幕上字體大小也要做到適配。自己總結(jié)了...
    深藍(lán)_S閱讀 20,508評論 17 31