我試圖在我的 UITextFields 上設定下劃線。我嘗試了幾種方法,但它們似乎都不起作用。在瀏覽了幾個網站后,最推薦的方法如下:
extension UITextField {
func setUnderLine() {
let border = CALayer()
let width = CGFloat(0.5)
border.borderColor = UIColor.lightGray.cgColor
border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width-10, height: self.frame.size.height)
border.borderWidth = width
self.layer.addSublayer(border)
self.layer.masksToBounds = true
}
}
我想不出為什么上面的代碼不起作用的任何原因,但我看到的所有答案都是幾年前發布的。
有人可以讓我知道我做錯了什么嗎?
uj5u.com熱心網友回復:
我在您發布的代碼中看到的一個問題是,如果調整文本欄位的大小,它將不會更新圖層。每次呼叫 setUnderLine() 函式時,它都會添加一個新層,然后忘記它。
我建議將 UITextField 子類化。該代碼可能如下所示:
class UnderlinedTextField: UITextField {
let underlineLayer = CALayer()
/// Size the underline layer and position it as a one point line under the text field.
func setupUnderlineLayer() {
var frame = self.bounds
frame.origin.y = frame.size.height - 1
frame.size.height = 1
underlineLayer.frame = frame
underlineLayer.backgroundColor = UIColor.blue.cgColor
}
// In `init?(coder:)` Add our underlineLayer as a sublayer of the view's main layer
required init?(coder: NSCoder) {
super.init(coder: coder)
self.layer.addSublayer(underlineLayer)
}
// in `init(frame:)` Add our underlineLayer as a sublayer of the view's main layer
override init(frame: CGRect) {
super.init(frame: frame)
self.layer.addSublayer(underlineLayer)
}
// Any time we are asked to update our subviews,
// adjust the size and placement of the underline layer too
override func layoutSubviews() {
super.layoutSubviews()
setupUnderlineLayer()
}
}
這將創建一個如下所示的文本欄位:

(請注意,如果將模擬器旋轉到橫向模式,則 UnderlineTextField 會重新定位新文本欄位邊界的下劃線層。)
請注意,使用所需的下劃線顏色將 UIView 添加到故事板可能更容易,固定到文本欄位的底部和一個像素高。(您可以使用 AutoLayout 約束設定下劃線視圖,并為其指定背景顏色。)如果這樣做,您根本不需要任何代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/386058.html
上一篇:解決與SwiftUIForEach一起使用的可選一對一關系?
下一篇:一個尋路問題:如何判斷水路情況?
