UITextField子类的下面有条形:条形不完全

时间:2019-03-26 17:58:51

标签: ios swift uiview uitextfield

目标

我已经创建了自己的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 :(得分:0)

您需要

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 / sample(myDF$V1) 内捕获的,因此如果该帧是在IB中为当前开发设备尺寸设置的,则为

答案 1 :(得分:0)

  

我唯一能想到的是,在将约束应用于视图之前,代码(在下面复制)中指定的尺寸是正确的,

完全正确!整个问题是您正在根据文本字段的框架对条形框架进行硬编码。但是在init期间尚不知道文本字段的框架。

您的整个方法是错误的。您应该使用自动布局约束将条形图约束到文本字段,而不是给该条形图固定的框架。这样,无论文本字段的大小发生什么变化(因为它遵循您所给的限制),条形的大小都会完美协调。