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

前端 未结 22 2074
自闭症患者
自闭症患者 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条回答
  • 2020-11-27 09:48

    You can create this extension outside class and replace width with whatever borderWidth you want.

    Swift 4

    extension UITextField
    {
        func setBottomBorder(withColor color: UIColor)
        {
            self.borderStyle = UITextBorderStyle.none
            self.backgroundColor = UIColor.clear
            let width: CGFloat = 1.0
    
            let borderLine = UIView(frame: CGRect(x: 0, y: self.frame.height - width, width: self.frame.width, height: width))
            borderLine.backgroundColor = color
            self.addSubview(borderLine)
        }
    }
    

    Original

    extension UITextField
    {
        func setBottomBorder(borderColor: UIColor)
        {
            self.borderStyle = UITextBorderStyle.None
            self.backgroundColor = UIColor.clearColor()
            let width = 1.0
    
            let borderLine = UIView(frame: CGRectMake(0, self.frame.height - width, self.frame.width, width))
            borderLine.backgroundColor = borderColor
            self.addSubview(borderLine)
        }
    }
    

    and then add this to your viewDidLoad replacing yourTextField with your UITextField variable and with any color you want in the border

    yourTextField.setBottomBorder(UIColor.blackColor())
    

    This basically adds a view with that color at the bottom of the text field.

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

    On Swift 3. You can create an extension and add after your view class.

    extension UITextField
    {
        func setBottomBorder(borderColor: UIColor)
        {
    
            self.borderStyle = UITextBorderStyle.none
            self.backgroundColor = UIColor.clear
            let width = 1.0
    
            let borderLine = UIView()
            borderLine.frame = CGRect(x: 0, y: Double(self.frame.height) - width, width: Double(self.frame.width), height: width)
    
            borderLine.backgroundColor = borderColor
            self.addSubview(borderLine)
        }
    }
    
    0 讨论(0)
  • 2020-11-27 09:50
    import UIkit 
    
    extension UITextField
    
    {
    
    func underlinedLogin()
    
    {
    
        let border = CALayer()
    
        let width = CGFloat(1.0)
    
        border.borderColor = UIColor.black.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
    }
    

    }

    call method on viewdidload

    mobileNumberTextField.underlinedLogin()

    passwordTextField.underlinedLogin()

    //select like text field on mainstoryboard

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

    I have looked at each of these solutions that also seem to work with one issue. Dark Mode and the background setting

    The Background setting of the UITextField must match the background of the parent view or no line appears

    So this will work on light mode To get to work in dark mode change the background color to black and it works Exclude back color and the line does not appear

    let field = UITextField() 
    field.backgroundColor = UIColor.white
    field.bottomBorderColor = UIColor.red
    

    This ended up being the best solution for me

    extension UITextField {
    
        func addPadding() {
            let paddingView = UIView(frame: CGRect(x:0, y:0, width: 10, height: self.frame.height))
            self.leftView = paddingView
            self.leftViewMode = .always
          }
    
          @IBInspectable var placeHolderColor: UIColor? {
              get {
                  return self.placeHolderColor
              }
              set {
                self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSAttributedString.Key.foregroundColor: newValue!])
              }
          }
    
          @IBInspectable var bottomBorderColor: UIColor? {
              get {
                  return self.bottomBorderColor
              }
              set {
                self.borderStyle = .none
                self.layer.masksToBounds = false
                self.layer.shadowColor = newValue?.cgColor
                self.layer.shadowOffset = CGSize(width: 0.0, height: 1.0)
                self.layer.shadowOpacity = 1.0
                self.layer.shadowRadius = 0.0
              }
          }
        }
    
    0 讨论(0)
  • 2020-11-27 09:53

    Here is swift3 code with @IBInspectable

    create a new file Cocoa Touch Class Swift File

    import UIKit
    
    
    extension UIView {
    
    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }
    
    @IBInspectable var borderWidth: CGFloat {
        get {
            return layer.borderWidth
        }
        set {
            layer.borderWidth = newValue
        }
    }
    
    @IBInspectable var borderColor: UIColor? {
        get {
            return UIColor(cgColor: layer.borderColor!)
        }
        set {
            layer.borderColor = newValue?.cgColor
        }
    }
    
    @IBInspectable var leftBorderWidth: CGFloat {
        get {
            return 0.0   // Just to satisfy property
        }
        set {
            let line = UIView(frame: CGRect(x: 0.0, y: 0.0, width: newValue, height: bounds.height))
            line.translatesAutoresizingMaskIntoConstraints = false
            line.backgroundColor = UIColor(cgColor: layer.borderColor!)
           line.tag = 110
            self.addSubview(line)
    
            let views = ["line": line]
            let metrics = ["lineWidth": newValue]
            addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|[line(==lineWidth)]", options: [], metrics: metrics, views: views))
            addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[line]|", options: [], metrics: nil, views: views))
        }
    }
    
    @IBInspectable var topBorderWidth: CGFloat {
        get {
            return 0.0   // Just to satisfy property
        }
        set {
            let line = UIView(frame: CGRect(x: 0.0, y: 0.0, width: bounds.width, height: newValue))
            line.translatesAutoresizingMaskIntoConstraints = false
            line.backgroundColor = borderColor
           line.tag = 110
            self.addSubview(line)
    
            let views = ["line": line]
            let metrics = ["lineWidth": newValue]
            addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|[line]|", options: [], metrics: nil, views: views))
            addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[line(==lineWidth)]", options: [], metrics: metrics, views: views))
        }
    }
    
    @IBInspectable var rightBorderWidth: CGFloat {
        get {
            return 0.0   // Just to satisfy property
        }
        set {
            let line = UIView(frame: CGRect(x: bounds.width, y: 0.0, width: newValue, height: bounds.height))
            line.translatesAutoresizingMaskIntoConstraints = false
            line.backgroundColor = borderColor
           line.tag = 110
            self.addSubview(line)
    
            let views = ["line": line]
            let metrics = ["lineWidth": newValue]
            addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "[line(==lineWidth)]|", options: [], metrics: metrics, views: views))
            addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[line]|", options: [], metrics: nil, views: views))
        }
    }
    @IBInspectable var bottomBorderWidth: CGFloat {
        get {
            return 0.0   // Just to satisfy property
        }
        set {
            let line = UIView(frame: CGRect(x: 0.0, y: bounds.height, width: bounds.width, height: newValue))
            line.translatesAutoresizingMaskIntoConstraints = false
            line.backgroundColor = borderColor
          line.tag = 110
            self.addSubview(line)
    
            let views = ["line": line]
            let metrics = ["lineWidth": newValue]
            addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|[line]|", options: [], metrics: nil, views: views))
            addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[line(==lineWidth)]|", options: [], metrics: metrics, views: views))
        }
    }
     func removeborder() {
          for view in self.subviews {
               if view.tag == 110  {
                    view.removeFromSuperview()
               }
    
          }
     }
    

    }

    and replace the file with the below code and you will get the option in storyboard attribute inspector like this

    Enjoy :)

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

    you can create one image for bottom border and set it to the background of your UITextField :

     yourTextField.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"yourBorderedImageName"]];
    

    or set borderStyle to none and put image of line exactly equal length to textfield!

    0 讨论(0)
提交回复
热议问题