Нижняя граница для текстового поля не отображается - PullRequest
1 голос
/ 11 июня 2019

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

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

    }
}

Надеюсь, кто-нибудь может мне помочь! Спасибо! :)

Ответы [ 5 ]

4 голосов
/ 11 июня 2019

Вот что вам не хватало: вы использовали рамку основного вида для создания рамки вашего слоя. Вы должны использовать текстовое поле.

Также сначала нарисуйте текстовое поле правильно с ограничениями, затем добавьте слой в текстовое поле.

В viewDidLoad ваш просмотр контента загружен в основную память. В этом методе нет назначения фреймов. Поэтому используйте viewWillAppear или viewDidAppear .

Теперь, когда ваш вид будет появляться каждый раз, когда будет добавлен новый 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)
}
1 голос
/ 11 июня 2019
bottomLine.frame = CGRect(x: 0, y: view.frame.height - 1, width: view.frame.width, height: 1.0)

вы должны использовать username.bounds вместо view.frame

0 голосов
/ 11 июня 2019

Попробуйте это

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)

0 голосов
/ 11 июня 2019
    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

enter image description here

0 голосов
/ 11 июня 2019

вместо добавления слоя возможно, вам следует добавить 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

         }
        }
...