每一年開始的時候都許願,今年要好好寫博客,記錄學到的東西,而後只堅持一兩篇。今年也不例外!這就是第一篇:)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 有兩個必要的重現條件:測試
defaultTextAttributes
必須得有 .font
這個 key。若是沒有這個 key,也是不會出現問題的。這確定是蘋果 UIKit 自帶的 bug 無疑了。既然知道了重現條件,解決這個問題的方法也很簡單…… 就是在設置 defaultTextAttributes
的時候,先把 .font
從裏面去掉,而後在後面再補一句 textfield.font = UIFont.systemFont(ofSize: fontSize)
就好了。字體
由於工程上代碼比較複雜,我花了很久才定位到問題、作出能重現的 demo…… 因此在此記錄一下,祭奠我浪費的幾個小時本能夠睡懶覺的時間 ><ui