UITextField подкласс с полосой внизу: полоса не доходит до конца - PullRequest
0 голосов
/ 26 марта 2019

Цель

Я создал свой собственный подкласс UITextField, чтобы спроектировать его так, чтобы не было границы, только белая линия под текстом. (Код подкласса ниже)

Выпуск

К сожалению, белая линия не доходит до конца текстового поля (по ширине): Я ограничил текстовое поле расстоянием 0 px к левому и правому краям вида, но, как показывают изображения ниже, линия не соответствует этим ограничениям.

enter image description here enter image description here

Мои исследования и гипотезы

Я потратил довольно много времени на отладку, единственное, о чем я могу думать, это то, что измерения, указанные в коде (скопированы ниже), выполняются до того, как ограничения применяются к представлению, что я не знаю как решить.

код

//In a UITextField subclass

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

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setup()
}

public override func awakeFromNib() {
    super.awakeFromNib()
    setup()
}

func setup() {

    self.delegate = self        

    //  BORDER
    //  Remove rectangular border
    self.borderStyle = .none
    self.layer.borderColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0).cgColor   //Make transparent
    self.layer.borderWidth = 0  // width = 0

    //  Add bottom border
    bottomBorder = UIView(frame: CGRect(x: 0, y: self.frame.height, width: self.frame.width, height: 1))
    bottomBorder.backgroundColor = UIColor.white
    self.addSubview(bottomBorder)

}

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Единственное, о чем я могу думать, - это то, что измерения, указанные в коде (скопированы ниже), выполняются до применения ограничений к представлению,

Совершенно верно! Вся проблема заключается в том, что вы жестко программируете рамку панели на основе рамки текстового поля. Но рамка текстового поля еще не известна во время init.

Весь ваш подход здесь неверен. Вы должны использовать ограничения для автоматического размещения до , ограничивающие панель для текстового поля, не давая панели фиксированную рамку. Таким образом, независимо от того, что происходит с размером текстового поля (поскольку оно подчиняется введенным вами ограничениям), размер полосы будет следовать в идеальной гармонии.

0 голосов
/ 26 марта 2019

Вам нужно

override func layoutSubviews() {
   super.layoutSubviews()
   bottomBorder.frame = CGRect(x: 0, y: self.frame.height - 1, width: self.frame.width, height: 1)
}

Поскольку правильный размер кадра superView зафиксирован внутри layoutSubviews, а не в init / awakeFromNib, где кадр установлен для текущих размеров устройства разработки, если он находится в IB

...