iOS UITextField 的坑:更改顏色致使字體忽大忽小

每一年開始的時候都許願,今年要好好寫博客,記錄學到的東西,而後只堅持一兩篇。今年也不例外!這就是第一篇:)git

最近遇到一個很是奇怪的 UI bug。業務上有一個需求,就是在頁面滾動的時候,讓一個 UITextField 的文字顏色逐漸變化。很正常的需求吧?然而出現了很是奇怪的現象:儘管代碼只改了字體的顏色,文字的大小卻也會忽大忽小,像下面的 gif 所示:github

忽大忽小的文字

我作了一個 demo 來重現問題(demo 地址),代碼很是簡單,以下:bash

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 = "這是一行測試用的文字"
    view.addSubview(textfield)
  }

  @IBAction func sliderValueChanged(_ sender: Any) {
    let textColor = UIColor.black.colorByBlending(
      with: UIColor.white,
      percent: CGFloat(slider.value))
    textfield.defaultTextAttributes = [
      // 註釋掉下面這一行,問題就會消失
      .font: UIFont.systemFont(ofSize: fontSize),
      .foregroundColor: textColor
    ]
    // textfield.font = UIFont.systemFont(ofSize: fontSize)
  }
}
複製代碼

能夠看到,設置 defaultTextAttributes 的時候,只有 .foregroundColor 這個屬性發生了變化,而雖然有 .font 這個 key 但 value 帶的 fontSize 是一個常數,它是徹底沒變化的。然鵝,卻出現了字體忽大忽小的問題……ide

通過一番研究,發現這個 bug 有兩個必要的重現條件:測試

  1. 文字必須是中文。其餘語言我沒試過,純英文的文字是不會出現問題的;
  2. defaultTextAttributes 必須得有 .font 這個 key。若是沒有這個 key,也是不會出現問題的。

這確定是蘋果 UIKit 自帶的 bug 無疑了。既然知道了重現條件,解決這個問題的方法也很簡單…… 就是在設置 defaultTextAttributes 的時候,先把 .font 從裏面去掉,而後在後面再補一句 textfield.font = UIFont.systemFont(ofSize: fontSize) 就好了。字體

由於工程上代碼比較複雜,我花了很久才定位到問題、作出能重現的 demo…… 因此在此記錄一下,祭奠我浪費的幾個小時本能夠睡懶覺的時間 ><ui

相關文章
相關標籤/搜索