我需要帮助解决此问题:我有一个UITextFiled,我正在尝试使用此代码在底部应用边框:
func addBottomBorderWithColor(color: UIColor, width: CGFloat) {
let border = CALayer()
border.backgroundColor = color.cgColor
border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: width)
self.layer.addSublayer(border)
}
问题在于结果不正确,边框超出了文本字段的范围,因为在文本字段中,我使用的是“等宽约束”,而设计时的宽度与“ Didload()中的宽度不同” “ 时间。有一种方法可以在“等宽约束”校正后获取textField的宽度?
答案 0 :(得分:2)
一种更好的方法是
UITextField
layoutSubviews()
中更改该层的框架示例:
@IBDesignable
class UnderlinedTextField: UITextField {
let underlineLayer: CALayer = CALayer()
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
func commonInit() -> Void {
layer.addSublayer(underlineLayer)
underlineLayer.backgroundColor = UIColor.black.cgColor
}
override func layoutSubviews() {
super.layoutSubviews()
underlineLayer.frame = CGRect(x: 0, y: bounds.height - 2.0, width: bounds.width, height: 2)
}
}
结果(我为文本字段设置了.cyan
的背景色,以便于查看)
当字段大小更改时(例如在设备旋转时),它会自动调整“下划线”的大小:
请注意,通过将其设置为@IBDesignable
,您还可以在设计时看到下划线层。
此示例为“下划线”使用默认的黑色,但是您可以像其他任何属性更改一样通过代码对其进行更改,例如:
testField.underlineLayer.backgroundColor = UIColor.red.cgColor
答案 1 :(得分:1)
覆盖bounds
变量,并在didSet
中调用边框图。每当视图更改范围时,您的图层都会更新。
var border = CALayer()
init(frame: CGRect) {
super.init(farme: frame)
self.layer.addSublayer(border)
}
override var bounds: CGRect {
didSet {
addBottomBorderWithColor(color: .black, width: 2)
}
}
func addBottomBorderWithColor(color: UIColor, width: CGFloat) {
border.backgroundColor = color.cgColor
border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: width)
self.layer.setNeedsLayout()
}
答案 2 :(得分:0)
我自己找到了一个可能的解决方案(不是完美的方案)。 因为该约束可能是在DidLoad()之后和viewDidLayoutSubviews()之后应用的,所以我调用了该函数以在函数viewDidAppear()中添加边框。现在,即使以很小的延迟显示新边框也可以使用。
最好的方法是子类化UITextFiled,如此处所述。 Custom class that can be applied to every UITextField - Swift
在这种情况下,正确创建了对象