简体   繁体   中英

Changing UIAlertController textfield's background color doesn't work

let alert = UIAlertController(title: "Breaking Point Stack", message: "What's the average breaking point stack you have?", preferredStyle: UIAlertControllerStyle.alert)

alert.addTextField() { textField in
    textField.backgroundColor = UIColor.clear
    textField.useUnderLine()
}

self.present(alert, animated: true, completion: nil)

The text field is expected to show no background color and a white line at the bottom, however, when the alert controller is presented, the background of the text field is still white with a black border.

Here's the code for useUnderLine() :

func useUnderLine() {
    self.borderStyle = .none
    self.layoutIfNeeded()

    let border = CALayer()
    let width = CGFloat(1.0)
    border.borderColor = UIColor.white.cgColor
    border.frame = CGRect(x: 0, y: self.frame.size.height - width, width:  self.frame.size.width, height: width)
    border.borderWidth = width

    self.layer.addSublayer(border)
    self.layer.masksToBounds = true
}

The border & background style isn't decided by UITextField actually if you debug it by view hierarchy as Figure 1.

视图层次

You do this change:

extension UITextField {

    func useUnderLine() {

        ....

        superview?.backgroundColor = .clear

        let view = superview?.superview
        view?.subviews.first?.alpha = 0
        view?.backgroundColor = .clear

    }

}

Modify the presending function too:

    present(alert, animated: false, completion: {
        if let textField = alert.textFields?.first {
            textField.useUnderLine()
        }
    })

屏幕截图

But aware that the View hierarchy might be different of different iOS version in the future.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM