Objective-C 方法調(diào)配技術(shù)項目實踐

Objective-C對象接收到消息后,究竟會調(diào)用何種方法需要在運行時才能解析出來动分。對于給定的消息触幼,與之對應(yīng)的方法也可以在對象接收到這條消息的時候被替換成另外的方法。這一特性讓我們能夠在不需要源代碼恨闪,也不需要繼承子類來覆寫方法就能改變這個類本身的功能倘感,新功能可以在這個類的所有實例中生效。這個方案被稱為“方法調(diào)配”(Method Swizzling)咙咽。

在最近的項目中老玛,我們發(fā)現(xiàn)在不同屏幕上如果字體大小相同的話會不協(xié)調(diào),需要在小屏幕的手機上讓字體小一點钧敞,在大屏幕上的字體大一點蜡豹。這包括了UIlabel,UIButton,UITextField
以及UITextView。這些UIKit框架中的類使用非常頻繁溉苛,在每一個UIViewController中都會用到镜廉。要想實現(xiàn)“在不同屏幕上字體大小不同”這一需求的話,有兩種方案:一是自定義子類繼承對應(yīng)的UIKit類愚战,在自定義的子類中處理字體大小娇唯。還有一種方案就是使用runtime的黑魔法:Method Swizzling。替換掉原先的初始化方法寂玲,使用新的自定義的初始化方法塔插,在自定義的初始化方法中設(shè)置字體的大小。

下面以UILabel舉例:


#define ScreenScale [UIScreen mainScreen].bounds.size.width/375.f

@interface UILabel (FontSize)

@end

@implementation UILabel (FontSize)

+ (void)load{
    Method imp = class_getInstanceMethod([self class], @selector(initWithCoder:));
    Method myImp = class_getInstanceMethod([self class], @selector(myInitWithCoder:));
    method_exchangeImplementations(imp, myImp);
    
    Method cmp = class_getInstanceMethod([self class], @selector(initWithFrame:));
    Method myCmp = class_getInstanceMethod([self class], @selector(myInitWithFrame:));
    method_exchangeImplementations(cmp, myCmp);
}

- (id)myInitWithCoder:(NSCoder*)aDecode {
    [self myInitWithCoder:aDecode];
    if (self) {
        CGFloat fontSize = self.font.pointSize;
        CGFloat scale = [UIView getFontScale];
        self.font = [self.font fontWithSize:fontSize* ScreenScale];
    }
    return self;
}

下面是demo在iPhone SE和iPhone 7 Plus上運行的效果拓哟∠胄恚可以看到,字體大小顯得自然了。使用Method Swizzling將再也不用再設(shè)置每一個控件的字體大小了流纹。

iPhone SE.png
iPhone 7 Plus.png

這樣糜烹,所有的UILabel的字體大小都會根據(jù)屏幕的尺寸進(jìn)行調(diào)整。

聲明:本文中用到的demo借鑒了開源的代碼FontSizeModify Created by dyw.感謝Effective Objective-C 2.0提供的思路疮蹦。

完整demo地址:https://github.com/EdYao/CYFontSizeDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碉哑,一起剝皮案震驚了整個濱河市挚币,隨后出現(xiàn)的幾起案子扣典,更是在濱河造成了極大的恐慌妆毕,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贮尖,死亡現(xiàn)場離奇詭異,居然都是意外死亡湿硝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門关斜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來示括,“玉大人,你說我怎么就攤上這事痢畜《庀ィ” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵吼拥,是天一觀的道長线衫。 經(jīng)常有香客問我,道長授账,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任全肮,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己乍恐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布百匆。 她就那樣靜靜地躺著呜投,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仑荐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天啥寇,我揣著相機與錄音,去河邊找鬼辑甜。 笑死袍冷,一個胖子當(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
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年奥务,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氯葬。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖官研,靈堂內(nèi)的尸體忽然破棺而出闯睹,到底是詐尸還是另有隱情戏羽,我是刑警寧澤瞻坝,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站衙荐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏忧吟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一溜族、第九天 我趴在偏房一處隱蔽的房頂上張望垦沉。 院中可真熱鬧,春花似錦厕倍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棒仍。三九已至臭胜,卻和暖如春莫其,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榜配。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人睛驳。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像淫茵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匙瘪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫蝶缀、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,117評論 4 61
  • 我站在你身后 灰石級站臺外彌漫嘹亮地汽笛 伊離開的距離咫尺之間 竟惹我相思如常 我故作堅強 卻不忍轉(zhuǎn)身 總以為伊?xí)?..
    祁連牧雪閱讀 186評論 0 5
  • 第一課:微信公眾號是一個閉環(huán)商業(yè)生態(tài) (一) 微信公眾號=寫作+公眾號 寫作不是一小部分人的愛好碍论,是職場的底層競爭...
    鄭宇辰閱讀 859評論 2 5
  • 教育占锯,就是當(dāng)我們把教的知識都忘光之后,剩下的那些東西消略。今天,我就想講一下那些在我把看過的劇情都忘的差不多之后艺演,仍留...
    想做點輸出的云寶閱讀 1,510評論 0 0