Add bottom line to view in SwiftUI / Swift / Objective-C / Xamarin

前端 未结 22 2071
自闭症患者
自闭症患者 2020-11-27 09:19

I would like to keep the border at the bottom part only in UITextField. But I don\'t know how we can keep it on the bottom side.

Can you please advise m

相关标签:
22条回答
  • What I did was to create an extension to UITextField and added a Designer editable property. Setting this property to any color would change the border (bottom) to that color (setting other borders to none).

    Since this also requires to change the place holder text color, I also added that to the extension.

        extension UITextField {
    
        @IBInspectable var placeHolderColor: UIColor? {
            get {
                return self.placeHolderColor
            }
            set {
                self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSForegroundColorAttributeName: newValue!])
            }
        }
    
    
        @IBInspectable var bottomBorderColor: UIColor? {
            get {
                return self.bottomBorderColor
            }
            set {
                self.borderStyle = UITextBorderStyle.None;
                let border = CALayer()
                let width = CGFloat(0.5)
                border.borderColor = newValue?.CGColor
                border.frame = CGRect(x: 0, y: self.frame.size.height - width,   width:  self.frame.size.width, height: self.frame.size.height)
    
                border.borderWidth = width
                self.layer.addSublayer(border)
                self.layer.masksToBounds = true
    
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-27 09:39

    In SwiftUI, The simplest implementation would be,

    struct MyTextField: View {
      var myPlaceHolder: String
      @Binding var text: String
    
      var underColor: Color
      var height: CGFloat
    
      var body: some View {
        VStack {
            TextField(self.myPlaceHolder, text: $text)
            .padding(.horizontal, 24)
            .font(.title)
    
            Rectangle().frame(height: self.height)
                .padding(.horizontal, 24).foregroundColor(self.underColor)
        }
      }
    }
    

    Usage:

    MyTextField(myPlaceHolder: "PlaceHolder", text: self.$text, underColor: .red, height: 3)
    

    0 讨论(0)
  • 2020-11-27 09:45

    Please have a look at the below code sample;

    Swift 4:

    @IBDesignable class DesignableUITextField: UITextField {
    
        let border = CALayer()
    
        @IBInspectable var borderColor: UIColor? {
            didSet {
                setup()
            }
        }
    
        @IBInspectable var borderWidth: CGFloat = 0.5 {
            didSet {
                setup()
            }
        }
    
        func setup() {
            border.borderColor = self.borderColor?.cgColor
    
            border.borderWidth = borderWidth
            self.layer.addSublayer(border)
            self.layer.masksToBounds = true
        }
    
        override func layoutSubviews() {
            super.layoutSubviews()
            border.frame = CGRect(x: 0, y: self.frame.size.height - borderWidth, width:  self.frame.size.width, height: self.frame.size.height)
        }
     }
    
    0 讨论(0)
  • 2020-11-27 09:45

    Updated Code:

    Swift 5.0

    extension UITextField {
      func addUnderline() { 
       let layer = CALayer()
       layer.backgroundColor = #colorLiteral(red: 0.6666666865, green: 0.6666666865, blue: 0.6666666865, alpha: 1)
       layer.frame = CGRect(x: 0.0, y: self.frame.size.height - 1.0, width: self.frame.size.width, height: 1.0)
       self.clipsToBounds = true
       self.layer.addSublayer(layer)
       self.setNeedsDisplay()} }
    

    Now call this func in viewDidLayoutSubviews()

    override func viewDidLayoutSubviews() {
        textField.addUnderline()
    }
    

    NOTE: This method will only work in viewDidLayoutSubviews()

    0 讨论(0)
  • 2020-11-27 09:45
    let border = CALayer()
         let lineWidth = CGFloat(0.3)
         border.borderColor = UIColor.lightGray.cgColor
         border.frame = CGRect(x: 0, y: emailTextField.frame.size.height - lineWidth, width:  emailTextField.frame.size.width, height: emailTextField.frame.size.height)
         border.borderWidth = lineWidth
         emailTextField.layer.addSublayer(border)
         emailTextField.layer.masksToBounds = true
    

    Tutorial

    0 讨论(0)
  • 2020-11-27 09:47

    ** Here myTF is outlet for MT TEXT FIELD **

            let border = CALayer()
            let width = CGFloat(2.0)
            border.borderColor = UIColor.darkGray.cgColor
            border.frame = CGRect(x: 0, y: self.myTF.frame.size.height - width, width:  self.myTF.frame.size.width, height: self.myTF.frame.size.height)
    
            border.borderWidth = width
            self.myTF.layer.addSublayer(border)
            self.myTF.layer.masksToBounds = true
    
    0 讨论(0)
提交回复
热议问题