Метка в левом окне uitextfield не выровнена с текстом - PullRequest
0 голосов
/ 28 июня 2018

Я создаю пользовательский textField с меткой в ​​левом виде, но текст метки не выровнен с текстом / заполнителем textField.

Вот мой простой код:

 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)
    }
}

Вот результат на симуляторе (я подчеркнул красным, чтобы увидеть разницу) и иерархия представления отладки:

enter image description here

enter image description here

Как это исправить?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы делаете:

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

Проблема в том, что базовые линии по умолчанию, макеты вставок, текстовые контейнеры для UILabel не совпадают с теми, которые по умолчанию используются для UITextField.

Они не одинаковы между UITextView и UILabel тоже. Просто отметьте этот связанный вопрос (они тоже на SO). Автор накладывает UITextView и UILabel, и рендеринг отличается.

Быстрый способ сделать это, избегая повторения всех внутренних настроек макета UITextField и копировать его на UILabel, - установить leftView как UITextField. Просто сделайте его «невыбираемым / недоступным для редактирования», и это должно создать идеальную иллюзию.

0 голосов
/ 28 июня 2018

Это может быть проблема рендеринга со стилем шрифта или ограниченным размером рамки для обоих видов. Попробуйте настроить y-position или height для левой метки.

Это не точный ответ, который вы ищете. Но это может решить вашу проблему.

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

или

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

Я пробовал это:

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!)
    }

}

Результат:

enter image description here

...