在開發(fā)過程中,有時候我們需要在UITextField左邊放置一個圖片,例如想得到下面的效果:

想要得到上面的效果,我們需要完成三個任務:1)設置圖片;2)改變圖片與textField最左邊的距離;3)改變圖片與textField文字的距離。
設置圖片
仔細看UITextField的API我們可以知道,UITextField有兩個屬性,leftView和rightView,這兩個屬性可以分別用來設置textField內部左邊和右邊的視圖。這里只演示leftView,rightView也是一樣的,只是顯示在右邊而已,代碼如下:
titleTextField.leftView = UIImageView(image: UIImage(named: "title_image"))
titleTextField.leftViewMode = .always // 必須設置leftViewMode屬性,不然leftView不會顯示出來
其中l(wèi)eftViewMode是一個UITextFieldMode的枚舉類型,它的值如下:
public enum UITextFieldViewMode : Int {
case never // 從不顯示
case whileEditing // 當編輯的時候顯示
case unlessEditing // 正在編輯的時候不顯示,其他情況都顯示
case always // 無論什么情況,一直顯示
}
改變圖片與textField最左邊的距離
當設置好leftView之后,我們發(fā)現(xiàn)leftView和左屏幕邊緣靠的太近,這時我們可以寫一個子類,繼承于UITextField,然后重寫父類的leftViewRect(forBounds bounds: CGRect) -> CGRect方法。因為textField在顯示的時候,會調用這個方法,我們可以利用這個方法來改變leftView在textField的位置,讓leftView往右偏一點。不要忘記把上面的titleTextField改為我們寫的子類。
override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
var rect = super.leftViewRect(forBounds: bounds)
rect.origin.x = 16 // 要往右偏多少根據自己需求,改變這個數字就好
return rect
}
改變圖片與textField文字的距離
我們再次運行之后,發(fā)現(xiàn)leftView和左屏幕邊緣間距可以了,但是leftView和textField顯示的文字靠的太近,這時我們會想到改變textField顯示的文字的位置,然后去UITextField的API找到一個方法:textRect(forBounds bounds: CGRect) -> CGRect,沒錯,就是它,它可以改變文本的位置。
override func textRect(forBounds bounds: CGRect) -> CGRect {
var rect = super.textRect(forBounds: bounds)
rect.origin.x = 50 // 要往右偏多少根據自己需求,改變這個數字就好
return rect
}
當所有人都以為這樣完美解決問題了,但是當在我們textField輸入文字的時候,文本和leftView又黏在一起了,我們還得重寫一個方法來改變正在編輯時候的rect。
override func editingRect(forBounds bounds: CGRect) -> CGRect {
var rect = super.editingRect(forBounds: bounds)
rect.origin.x = 50 // 這個數字與textRect相同
return rect
}
到此就大功告成了。
金無足赤,人無完人。如果文中有錯誤,請指出!我們共同學習,共同進步。謝謝!