添加底线以在Swift/Objective C/Xamarin中查看

dha*_*hah 144 objective-c uitextfield ios xamarin swift

我想只在底部保留边框UITextField.但我不知道我们怎么能把它放在最底层.

你能告诉我吗?

Kam*_*pai 297

新方法:(推荐)

最后,我发现了另外一种方法,它更简单方便.但唯一的条件是UIControl必须包含自动布局.

我在这里使用视觉格式语言(VFL),这将允许添加任何行UIView.

助手方法:

您可以将此辅助方法添加到全局帮助程序类(我使用全局类方法)或在同一视图控制器中(使用实例方法).

import UIKit

enum LINE_POSITION {
    case LINE_POSITION_TOP
    case LINE_POSITION_BOTTOM
}

extension UIView {
    func addLine(position : LINE_POSITION, color: UIColor, width: Double) {
        let lineView = UIView()
        lineView.backgroundColor = color
        lineView.translatesAutoresizingMaskIntoConstraints = false // This is important!
        self.addSubview(lineView)

        let metrics = ["width" : NSNumber(value: width)]
        let views = ["lineView" : lineView]
        self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[lineView]|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))

        switch position {
        case .LINE_POSITION_TOP:
            self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[lineView(width)]", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))
            break
        case .LINE_POSITION_BOTTOM:
            self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[lineView(width)]|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))
            break
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

textField.addLine(position: .LINE_POSITION_BOTTOM, color: .darkGray, width: 0.5)
Run Code Online (Sandbox Code Playgroud)

使用Swift:

辅助方法:

typedef enum : NSUInteger {
    LINE_POSITION_TOP,
    LINE_POSITION_BOTTOM
} LINE_POSITION;


- (void) addLine:(UIView *)view atPosition:(LINE_POSITION)position withColor:(UIColor *)color lineWitdh:(CGFloat)width {
    // Add line
    UIView *lineView = [[UIView alloc] init];
    [lineView setBackgroundColor:color];
    [lineView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [view addSubview:lineView];

    NSDictionary *metrics = @{@"width" : [NSNumber numberWithFloat:width]};
    NSDictionary *views = @{@"lineView" : lineView};
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[lineView]|" options: 0 metrics:metrics views:views]];

    switch (position) {
        case LINE_POSITION_TOP:
            [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[lineView(width)]" options: 0 metrics:metrics views:views]];
            break;

        case LINE_POSITION_BOTTOM:
            [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[lineView(width)]|" options: 0 metrics:metrics views:views]];
            break;
        default: break;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

[self addLine:self.textField atPosition:LINE_POSITION_TOP withColor:[UIColor darkGrayColor] lineWitdh:0.5];
Run Code Online (Sandbox Code Playgroud)

旧方法:

如果以UIView+Extention.swift编程方式创建对象,此答案将完美地运行.

注意:如果UIControl在Storyboard中创建了对象,则将其UIView属性设置为UIView+Extention.swiftStoryboard Attributes Inspector.

以下变量UIControl是一个UIView控件对象,其中将设置底部边框.

SWIFT代码:

 var border = new CALayer();
 nfloat width = 2;
 border.BorderColor = UIColor.Black.CGColor;
 border.Frame = new CoreGraphics.CGRect(0, textField.Frame.Size.Height - width, textField.Frame.Size.Width, textField.Frame.Size.Height);
 border.BorderWidth = width;
 textField.Layer.AddSublayer(border);
 textField.Layer.MasksToBounds = true;
Run Code Online (Sandbox Code Playgroud)

目标C代码:

import UIKit

enum LINE_POSITION {
    case LINE_POSITION_TOP
    case LINE_POSITION_BOTTOM
}

extension UIView {
    func addLine(position : LINE_POSITION, color: UIColor, width: Double) {
        let lineView = UIView()
        lineView.backgroundColor = color
        lineView.translatesAutoresizingMaskIntoConstraints = false // This is important!
        self.addSubview(lineView)

        let metrics = ["width" : NSNumber(value: width)]
        let views = ["lineView" : lineView]
        self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[lineView]|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))

        switch position {
        case .LINE_POSITION_TOP:
            self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[lineView(width)]", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))
            break
        case .LINE_POSITION_BOTTOM:
            self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[lineView(width)]|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))
            break
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Xamarin代码:

textField.addLine(position: .LINE_POSITION_BOTTOM, color: .darkGray, width: 0.5)
Run Code Online (Sandbox Code Playgroud)

许多用户在自动布局方面遇到问题,有些人无法渲染UITextField的边框.这是解决方案:


如果你在UIView+Extention.swift方法中编写下面的代码而不是那个时候你将得不到textField的框架,那么边框将无法正确渲染.

要获得边框的正确框架,请覆盖UIControl并在其中编写代码.

UIView 将所有子视图加载到视图中后调用的方法.

不要忘记这个方法被多次调用,并且它不是ViewController生命周期的一部分,所以在使用它时要小心.

  • 我不认为将此代码放入viewDidLayoutSubviews是一个好方法.每次子视图更改时都会调用此方法.如果您有一个通常使用多个控件进行更改的视图,那么这是浪费内存以向uitextfield添加边框. (3认同)
  • @Kampai viewDidLayoutSubviews做了诀窍...... ty (2认同)
  • 我把它放到UITexctField类的layoutSubviews方法中,否则我不得不为每个文本字段制作IBOutlet - 不起作用,textview中的文本消失 (2认同)

sas*_*tch 149

如果你想事先不知道框架,没有子类化没有Autolayout:

Swift 4.x/ Swift 3.x

extension UITextField {
  func setBottomBorder() {
    self.borderStyle = .none
    self.layer.backgroundColor = UIColor.white.cgColor

    self.layer.masksToBounds = false
    self.layer.shadowColor = UIColor.gray.cgColor
    self.layer.shadowOffset = CGSize(width: 0.0, height: 1.0)
    self.layer.shadowOpacity = 1.0
    self.layer.shadowRadius = 0.0
  }
}
Run Code Online (Sandbox Code Playgroud)

yourTextField.setBottomBorder()从任何地方打电话,而不确定框架是否正确.

结果如下所示:

样品

  • 如果我们改变背景颜色以清除颜色,它就不起作用了. (10认同)
  • 是.如果我们在self.layer.backgroundColor = UIColor.white.cgColor中改变白色以清除颜色它不起作用 (7认同)

use*_*037 42

您可以创建一个子类,UITextField如下所示:

class TextField : UITextField {

    override var tintColor: UIColor! {

        didSet {
            setNeedsDisplay()
        }
    }

    override func draw(_ rect: CGRect) {

        let startingPoint   = CGPoint(x: rect.minX, y: rect.maxY)
        let endingPoint     = CGPoint(x: rect.maxX, y: rect.maxY)

        let path = UIBezierPath()

        path.move(to: startingPoint)
        path.addLine(to: endingPoint)
        path.lineWidth = 2.0

        tintColor.setStroke()

        path.stroke()
    }
}
Run Code Online (Sandbox Code Playgroud)


inf*_*783 23

这些解决方案都没有真正符合我的期望.我想子类的文本字段,因为我不想手动设置边框的所有时间.我还想更改边框颜色,例如错误.所以这是我的解决方案Anchors:

class CustomTextField: UITextField {

    var bottomBorder = UIView()

    override func awakeFromNib() {

            // Setup Bottom-Border

            self.translatesAutoresizingMaskIntoConstraints = false

            bottomBorder = UIView.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
            bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1) // Set Border-Color
            bottomBorder.translatesAutoresizingMaskIntoConstraints = false

            addSubview(bottomBorder)

            bottomBorder.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
            bottomBorder.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
            bottomBorder.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
            bottomBorder.heightAnchor.constraint(equalToConstant: 1).isActive = true // Set Border-Strength

    }
}
Run Code Online (Sandbox Code Playgroud)

- - 可选的 - -

要改变颜色,请添加如下CustomTextField Class:

@IBInspectable var hasError: Bool = false {
    didSet {

        if (hasError) {

            bottomBorder.backgroundColor = UIColor.red

        } else {

            bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1)

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

并在创建CustomTextField实例后触发错误调用

textField.hasError = !textField.hasError
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

希望它可以帮助某人;)

  • 到目前为止,您可以将其修改为其他"验证"状态 (2认同)

idr*_*dız 21

 extension UITextField {  
  func setBottomBorder(color:String) {
    self.borderStyle = UITextBorderStyle.None
    let border = CALayer()
    let width = CGFloat(1.0)
    border.borderColor = UIColor(hexString: color)!.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
   }
}
Run Code Online (Sandbox Code Playgroud)

然后就这样做:

yourTextField.setBottomBorder(color: "#3EFE46")
Run Code Online (Sandbox Code Playgroud)

  • 我想这样做,但如果我们在`viewDidLoad()`中使用它,框架将是不正确的.所以我们有两个选择:`viewDidLayoutSubviews()`或`viewDidAppear()`.但``viewDidLayoutSubviews()`被多次调用并且从`viewDidAppear()调用`将不是一个好的经验. (2认同)

Ris*_*hwa 12

您可以在类外部创建此扩展,并使用您想要的任何borderWidth替换width.

斯威夫特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)
    }
}
Run Code Online (Sandbox Code Playgroud)

原版的

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其添加到viewDidLoad中,用你的UITextField变量和你想要的任何颜色替换你的文本字段

yourTextField.setBottomBorder(UIColor.blackColor())
Run Code Online (Sandbox Code Playgroud)

这基本上在文本字段的底部添加了该颜色的视图.


Mit*_*iya 10

在此输入图像描述

目标C.

        [txt.layer setBackgroundColor: [[UIColor whiteColor] CGColor]];
        [txt.layer setBorderColor: [[UIColor grayColor] CGColor]];
        [txt.layer setBorderWidth: 0.0];
        [txt.layer setCornerRadius:12.0f];
        [txt.layer setMasksToBounds:NO];
        [txt.layer setShadowRadius:2.0f];
        txt.layer.shadowColor = [[UIColor blackColor] CGColor];
        txt.layer.shadowOffset = CGSizeMake(1.0f, 1.0f);
        txt.layer.shadowOpacity = 1.0f;
        txt.layer.shadowRadius = 1.0f;
Run Code Online (Sandbox Code Playgroud)

迅速

        txt.layer.backgroundColor = UIColor.white.cgColor
        txt.layer.borderColor = UIColor.gray.cgColor
        txt.layer.borderWidth = 0.0
        txt.layer.cornerRadius = 5
        txt.layer.masksToBounds = false
        txt.layer.shadowRadius = 2.0
        txt.layer.shadowColor = UIColor.black.cgColor
        txt.layer.shadowOffset = CGSize.init(width: 1.0, height: 1.0)
        txt.layer.shadowOpacity = 1.0
        txt.layer.shadowRadius = 1.0
Run Code Online (Sandbox Code Playgroud)


Kri*_*ula 7

我所做的是创建UITextField的扩展并添加Designer可编辑属性.将此属性设置为任何颜色会将边框(底部)更改为该颜色(将其他边框设置为无).

由于这也需要更改占位符文本颜色,我还将其添加到扩展名.

    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

        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

在Swift 3.您可以创建一个扩展并在视图类后添加.

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)
    }
}
Run Code Online (Sandbox Code Playgroud)


ima*_*man 6

请看下面的代码示例;

斯威夫特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)
    }
 }
Run Code Online (Sandbox Code Playgroud)