Swift - добавление нижней строки в UITextfield с интервалом - PullRequest
0 голосов
/ 21 января 2020

В данный момент я добавляю нижнюю строку к своему UITextfield с этим extension:

    enum LINE_POSITION {
    case LINE_POSITION_TOP
    case LINE_POSITION_BOTTOM
}

extension UIView {
    func addLine(position : LINE_POSITION, color: UIColor, width: Double) {
        let lineView = UIView()
        lineView.backgroundColor = color
        lineView.translatesAutoresizingMaskIntoConstraints = false // This is important!
        self.addSubview(lineView)

        let metrics = ["width" : NSNumber(value: width)]
        let views = ["lineView" : lineView]
        self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[lineView]|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))

        switch position {
        case .LINE_POSITION_TOP:
            self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[lineView(width)]", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))
            break
        case .LINE_POSITION_BOTTOM:
            self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[lineView(width)]|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))
            break
        }
    }
}

My Textxfield:

let emailTextfield: UITextField = {
    let v = UITextField()
    v.font = UIFont(name: "AvenirNext-Regular", size: 20)
    v.textColor = .white
    v.textAlignment = .left
    v.placeholder = "Email-Adresse"
    v.translatesAutoresizingMaskIntoConstraints = false
    v.addLine(position: .LINE_POSITION_BOTTOM, color: .blue, width: 2)
    v.addPadding(.left(60))
    return v
}()

Моя проблема в том, что строка появляется прямо под моим текстом, и я хотел бы иметь немного больший интервал между текстом и строкой. Есть ли простой способ сделать это?

1 Ответ

0 голосов
/ 21 января 2020

Добавить в метрики массив новой переменной "bottomMargin" и установить ее значение. Значения положительности нарисуют линию над нижней стороной textView, а отрицательные значения ниже. Затем обновите строку визуального формата до V: [lineView (width)] - (bottomMargin) - | для случая LINE_POSITION_BOTTOM

extension UIView {
    func addLine(position : LINE_POSITION, color: UIColor, width: Double) {
        let lineView = UIView()
        lineView.backgroundColor = color
        lineView.translatesAutoresizingMaskIntoConstraints = false // This is important!
        self.addSubview(lineView)

        let metrics = ["width" : NSNumber(value: width), "bottomMargin": NSNumber(value: -50)]
        let views = ["lineView" : lineView]
        self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[lineView]|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))

        switch position {
        case .LINE_POSITION_TOP:
            self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[lineView(width)]", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))
            break
        case .LINE_POSITION_BOTTOM:
            self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[lineView(width)]-(bottomMargin)-|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))
            break
        }
    }
}

Result

textField.addLine(position: .LINE_POSITION_BOTTOM, color: .blue, width: 2)

enter image description here

Проверка иерархии представления в случае проблемы

Использование отладочной иерархии представления XCode Кнопка ссылка

...