Label in uitextfield left view not aligned with the text

此生再无相见时 提交于 2019-12-11 01:14:41

问题


I'm making a custom textField with a label in his left view but the text of the label is not aligned with the text/placeholder of the textField.

Here my simple code:

 class mytextfield: UITextField {

    override init(frame: CGRect) {
        super.init(frame: frame)

        leftViewMode = .always
        let label = UILabel()

        label.text = "Hello"
        leftView = label
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(x: 0, y: 0, width: 40, height: bounds.height)
    }
}

Here the result on simulator (I underlined in red to see the difference) and debug view hierarchy:

How to fix this?


回答1:


This may be issue of rendering with font style or bound size of frame for both views. Try to adjust y-position or height for left label view.

This's not an exact answer, that you are looking for. But this may solve your problem.

override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
    return CGRect(x: 0, y: 0, width: 40, height: (bounds.height - 4))
}

or

override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
    return CGRect(x: 0, y: -2, width: 40, height: bounds.height)
}

I've tried this:

class LeftViewTextfield: UITextField {

    override init(frame: CGRect) {
        super.init(frame: frame)

        leftViewMode = .always
        let label = UILabel()
        label.backgroundColor = UIColor.yellow
        label.text = "Hello"
        label.font = UIFont.systemFont(ofSize: 16)
        leftView = label
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(x: 0, y: -0.5, width: 40, height: bounds.height)
    }
}


class TestViewController: UIViewController {

    var textField: LeftViewTextfield?
    override func viewDidLoad() {
        super.viewDidLoad()

        setupTextField()
    }

    func setupTextField() -> Void {
        textField = LeftViewTextfield(frame: CGRect(x: 40, y: 40, width: 100, height: 40))
        textField?.text = "Hello"
        textField?.font = UIFont.systemFont(ofSize: 16)
        textField?.backgroundColor = UIColor.orange
        self.view.addSubview(textField!)
    }

}

Result:




回答2:


You do:

let label = UILabel()
label.text = "Hello"
leftView = label

The issue is that the default baselines, insets layouts, text containers of a UILabel is not the same as the one by default used for a UITextField.

They are not the same between a UITextView and a UILabel too. Just check this related question (they are others on SO too). Author superpose a UITextView and a UILabel and the rendering is different.

Quick way to do so, avoiding repeating the whole internal layout settings of the UITextField and replicate it on the UILabel is to set the leftView as a UITextField. Just make it "non-selectable/non-editable" and it should make a perfect illusion.



来源:https://stackoverflow.com/questions/51078259/label-in-uitextfield-left-view-not-aligned-with-the-text

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!