【iOS開發(fā)】在textField左邊設置圖片以及圖片與textField最左邊和文字的距離

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

textField

想要得到上面的效果,我們需要完成三個任務: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
}

到此就大功告成了。

金無足赤,人無完人。如果文中有錯誤,請指出!我們共同學習,共同進步。謝謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容