Добавить в метрики массив новой переменной "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)
Проверка иерархии представления в случае проблемы
Использование отладочной иерархии представления XCode Кнопка ссылка