不显示文本字段的底部边框

Bottom border for text field doesn’t appear

我试图在我的文本字段中添加底部边框,但它不起作用。我知道那里有类似的问题,但这些答案中的 none 有帮助。另外,我删除了下面这行代码并尝试了,因为默认情况下没有边框,它仍然不起作用:

username.borderStyle = UITextField.BorderStyle.none

完整代码如下:

class SignUpScreen: UIViewController {

    let username = UITextField()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(username)

        // Background color
        view.backgroundColor = .white

        username.placeholder = "Name"
        username.borderStyle = UITextField.BorderStyle.none

        let bottomLine = CALayer()
        bottomLine.frame = CGRect(x: 0, y: view.frame.height - 1, width: view.frame.width, height: 1.0)
        bottomLine.backgroundColor = UIColor.black.cgColor
        username.layer.addSublayer(bottomLine)

        username.translatesAutoresizingMaskIntoConstraints = false
        username.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        username.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        username.widthAnchor.constraint(equalToConstant: 150).isActive = true
        username.heightAnchor.constraint(equalToConstant: 50).isActive = true

    }
}

希望有人能帮帮我!谢谢! :)

bottomLine.frame = CGRect(x: 0, y: view.frame.height - 1, width: view.frame.width, height: 1.0)

您必须使用 username.bounds,而不是 view.frame

与其添加 layer,不如将 border 添加为 UIView 并将其带到 top 还将您的 textField bgColor 设置为 clearColor:

     class SignUpScreen: UIViewController {

        let username = UITextField()

        override func viewDidLoad() {
            super.viewDidLoad()

            view.addSubview(username)

            // Background color
            view.backgroundColor = .white

            username.placeholder = "Name"
            username.borderStyle = UITextField.BorderStyle.none

            // make sure your textField doesn't have back ground
            username.backgroundColor = .clear

            let bottomLine = UIView()
            bottomLine.frame = CGRect(x: 0, y: view.frame.height - 1, width: view.frame.width, height: 1.0)
            bottomLine.backgroundColor = UIColor.black.cgColor

            // be sure you bring it to top
            self.view.layer.insertSublayer(bottomLine, at:0)

            username.translatesAutoresizingMaskIntoConstraints = false
            username.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            username.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
            username.widthAnchor.constraint(equalToConstant: 150).isActive = true
            username.heightAnchor.constraint(equalToConstant: 50).isActive = true

         }
        }

这是您遗漏的内容:您使用主视图的框架来创建图层的框架。您必须使用文本字段。

另外,首先使用约束正确绘制文本字段,然后将图层添加到文本字段。

viewDidLoad 中,您的内容视图已加载到主内存。该方法中没有帧分配。所以使用 viewWillAppearviewDidAppear.

现在,每次添加新的 TextField 和图层时,您的视图都会出现。因此,您需要进行检查以限制该行为。例如 如果文本字段已添加到您的视图中,则不要添加。

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    view.addSubview(username)

    /*
     * Create the text field
     */
    view.backgroundColor = .white
    username.placeholder = "Name"
    username.borderStyle = UITextField.BorderStyle.none
    username.translatesAutoresizingMaskIntoConstraints = false
    username.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    username.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    username.widthAnchor.constraint(equalToConstant: 300).isActive = true
    username.heightAnchor.constraint(equalToConstant: 50).isActive = true
}

override func viewDidAppear(_ animated: Bool) {

    super.viewDidAppear(animated)

    /*
     * Here add the shap layer
     */
    let bottomLine = CALayer()

    /*
     * Here is what you were missing.
     * You were using the main view's frame instead of your textfield
     */
    bottomLine.frame = CGRect(x: 0, y: username.bounds.height - 1, width: username.bounds.width, height: 1.0)
    bottomLine.backgroundColor = UIColor.black.cgColor
    username.layer.addSublayer(bottomLine)
}
    let border = CALayer()
    let width = CGFloat(3.0)
    border.borderColor = UIColor.black.cgColor
    border.frame = CGRect(x: 0, y: textFieldOutlet.frame.size.height - width, width: textFieldOutlet.frame.size.width, height: textFieldOutlet.frame.size.height)

    border.borderWidth = width
    textFieldOutlet.layer.addSublayer(border)
    textFieldOutlet.layer.masksToBounds = true

试试这个

func bottomBorderTextField(_ textField: UIView, color: UIColor) {
        // For Bottom Border
        let bottomLayer = CALayer()
        let frame = viewType.frame
        bottomLayer.frame = CGRect(x: 0, y: frame.height - 1, width: frame.width - 2, height: 0.5)
        bottomLayer.backgroundColor = color.cgColor
        viewType.layer.addSublayer(bottomLayer)
    }
  • viewDidload()
 self.bottomBorderTextField(self.txtField, color: yourTextColor)