iOS UITextField 的坑:更改顏色導(dǎo)致字體忽大忽小

每年開(kāi)始的時(shí)候都許愿紊服,今年要好好寫(xiě)博客檀轨,記錄學(xué)到的東西,然后只堅(jiān)持一兩篇围苫。今年也不例外!這就是第一篇:)

最近遇到一個(gè)非常奇怪的 UI bug撤师。業(yè)務(wù)上有一個(gè)需求剂府,就是在頁(yè)面滾動(dòng)的時(shí)候,讓一個(gè) UITextField 的文字顏色逐漸變化剃盾。很正常的需求吧腺占?然而出現(xiàn)了非常奇怪的現(xiàn)象:盡管代碼只改了字體的顏色,文字的大小卻也會(huì)忽大忽小痒谴,像下面的 gif 所示:

忽大忽小的文字

我做了一個(gè) demo 來(lái)重現(xiàn)問(wèn)題(demo 地址)衰伯,代碼非常簡(jiǎn)單,如下:

let fontSize: CGFloat = 14.0

class ViewController: UIViewController {

  var textfield: UITextField!
  @IBOutlet weak var slider: UISlider!

  override func viewDidLoad() {
    super.viewDidLoad()
    textfield = UITextField(frame: CGRect(x: 52, y: 200, width: 260, height: 19))
    textfield.font = UIFont.systemFont(ofSize: fontSize)
    textfield.backgroundColor = UIColor.red
    textfield.text = "這是一行測(cè)試用的文字"
    view.addSubview(textfield)
  }

  @IBAction func sliderValueChanged(_ sender: Any) {
    let textColor = UIColor.black.colorByBlending(
      with: UIColor.white,
      percent: CGFloat(slider.value))
    textfield.defaultTextAttributes = [
      // 注釋掉下面這一行积蔚,問(wèn)題就會(huì)消失
      .font: UIFont.systemFont(ofSize: fontSize),
      .foregroundColor: textColor
    ]
    // textfield.font = UIFont.systemFont(ofSize: fontSize)
  }
}

可以看到意鲸,設(shè)置 defaultTextAttributes 的時(shí)候,只有 .foregroundColor 這個(gè)屬性發(fā)生了變化尽爆,而雖然有 .font 這個(gè) key 但 value 帶的 fontSize 是一個(gè)常數(shù)怎顾,它是完全沒(méi)變化的。然鵝漱贱,卻出現(xiàn)了字體忽大忽小的問(wèn)題……

經(jīng)過(guò)一番研究槐雾,發(fā)現(xiàn)這個(gè) bug 有兩個(gè)必要的重現(xiàn)條件:

  1. 文字必須是中文。其他語(yǔ)言我沒(méi)試過(guò)幅狮,純英文的文字是不會(huì)出現(xiàn)問(wèn)題的募强;
  2. defaultTextAttributes 必須得有 .font 這個(gè) key。如果沒(méi)有這個(gè) key崇摄,也是不會(huì)出現(xiàn)問(wèn)題的擎值。

這肯定是蘋(píng)果 UIKit 自帶的 bug 無(wú)疑了。既然知道了重現(xiàn)條件逐抑,解決這個(gè)問(wèn)題的方法也很簡(jiǎn)單…… 就是在設(shè)置 defaultTextAttributes 的時(shí)候幅恋,先把 .font 從里面去掉,然后在后面再補(bǔ)一句 textfield.font = ... 就行了泵肄。

因?yàn)楣こ躺洗a比較復(fù)雜捆交,我花了好久才定位到問(wèn)題、做出能重現(xiàn)的 demo…… 所以在此記錄一下腐巢,祭奠我浪費(fèi)的幾個(gè)小時(shí)本可以睡懶覺(jué)的時(shí)間 ><

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末品追,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冯丙,更是在濱河造成了極大的恐慌肉瓦,老刑警劉巖遭京,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泞莉,居然都是意外死亡哪雕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)鲫趁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)斯嚎,“玉大人,你說(shuō)我怎么就攤上這事挨厚”てВ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵疫剃,是天一觀的道長(zhǎng)钉疫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)巢价,這世上最難降的妖魔是什么牲阁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮壤躲,結(jié)果婚禮上咨油,老公的妹妹穿的比我還像新娘。我一直安慰自己柒爵,他們只是感情好役电,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著棉胀,像睡著了一般法瑟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唁奢,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天霎挟,我揣著相機(jī)與錄音,去河邊找鬼麻掸。 笑死酥夭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脊奋。 我是一名探鬼主播熬北,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼诚隙!你這毒婦竟也來(lái)了讶隐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤久又,失蹤者是張志新(化名)和其女友劉穎巫延,沒(méi)想到半個(gè)月后效五,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炉峰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年畏妖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疼阔。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戒劫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竿开,到底是詐尸還是另有隱情谱仪,我是刑警寧澤玻熙,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布否彩,位于F島的核電站,受9級(jí)特大地震影響嗦随,放射性物質(zhì)發(fā)生泄漏列荔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一枚尼、第九天 我趴在偏房一處隱蔽的房頂上張望贴浙。 院中可真熱鬧,春花似錦署恍、人聲如沸崎溃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)袁串。三九已至,卻和暖如春呼巷,著一層夾襖步出監(jiān)牢的瞬間囱修,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工王悍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留破镰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓压储,卻偏偏與公主長(zhǎng)得像鲜漩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子集惋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353