无法更改自定义UITextField边框颜色

时间:2016-10-03 09:17:49

标签: ios swift uitextfield calayer

我正在尝试创建一个很好的textField,但它没有用。所以我的问题是,当我开始编辑文本字段时,我需要将边框颜色更改为另一个,但是当它发生时,我的自定义边框将转到默认的rect。我想要的只是改变底部边框的颜色。

func textFieldDidBeginEditing(_ textField: UITextField) {

    nameField.borderStyle = UITextBorderStyle.none
    nameField.layer.borderWidth = 2.0
    nameField.layer.borderColor = UIColor.red.cgColor
    nameField.layer.masksToBounds = true
    print("lol")
}

public func testField() {
    let border = CALayer()
    let width = CGFloat(2.0)

    border.borderColor = lightBlue
    border.frame = CGRect(x: 0, y: nameField.frame.size.height - width, width:  nameField.frame.size.width, height: nameField.frame.size.height)

    border.borderWidth = width
    nameField.layer.addSublayer(border)
    nameField.layer.masks[ToBounds = true
}

enter image description here enter image description here

5 个答案:

答案 0 :(得分:2)

这是一个解决方案。我已经将UITextField子类化并覆盖了layoutSubviews func,并检查它是否是firstResponder(意味着光标在那里)和是否设置相应的颜色。

斯威夫特(3.0):

class TextField: UITextField {
    lazy var bottomBorder: CALayer = {
            let border = CALayer();
            border.borderColor = UIColor.white.cgColor;
            border.borderWidth = 1;
            return border
    }()

    override func awakeFromNib() {
        super.awakeFromNib()

        borderStyle = .none;
        layer.addSublayer(bottomBorder);
    }

    override func layoutSubviews() {
        super.layoutSubviews();

        let borderColor = isFirstResponder ? UIColor.blue : UIColor.white;
        bottomBorder.borderColor = borderColor.cgColor;
        bottomBorder.frame = CGRect(x: 0, y: layer.frame.size.height - 1, width: layer.frame.size.width, height: 1)
    }
}

目标-C

@interface TextField ()

@property (nonatomic, strong) CALayer *bottomBorder;

@end

@implementation TextField

- (void)awakeFromNib {
    [super awakeFromNib];

    [self.layer addSublayer:self.bottomBorder];
}

- (void)layoutSubviews {
    [super layoutSubviews];

    UIColor *borderColor = self.isFirstResponder ? [UIColor blueColor] : [UIColor whiteColor];
    self.bottomBorder.borderColor = borderColor.CGColor;
    self.bottomBorder.frame = CGRectMake(0, self.layer.frame.size.height - 1, self.layer.frame.size.width, 1);
}

- (CALayer *)bottomBorder {
    if (!_bottomBorder) {
        _bottomBorder = [CALayer layer];
        _bottomBorder.borderColor = [UIColor whiteColor].CGColor;
        _bottomBorder.borderWidth = 1;
    }
    return _bottomBorder;
}

@end

答案 1 :(得分:0)

制作边框

let border = CALayer()

全局,只需在textFieldDidBeginEditing

中更改其borderColor
func textFieldDidBeginEditing(_ textField: UITextField) {
    border.borderColor = UIColor.red.cgColor
}

希望这有帮助。

答案 2 :(得分:0)

使用这段代码

func textFieldDidBeginEditing(_textField: UITextField) {
    nameField.layer.sublayers![1].borderColor = UIColor.redColor().CGColor

}

func testField() {
    nameField.layer.sublayers![0].hidden = true
    let border = CALayer()
    border.frame = CGRectMake(0, nameField.frame.size.height - 2, nameField.frame.size.width, 20)
    border.borderColor = UIColor.blueColor().CGColor
    border.borderWidth = 2
    nameField.layer.addSublayer(border)
}

答案 3 :(得分:0)

尝试在func textFieldDidBeginEditing(_ textField: UITextField)方法中添加此行代码,这将删除您的自定义图层,您可以看到更改已完成。

if (nameField.layer.sublayers?.count)! > 0{
    nameField.layer.sublayers?[0].removeFromSuperlayer()
}

希望这有帮助。

答案 4 :(得分:0)

您需要在文本字段的边框添加其他子图层,以便分配任何颜色。

   let border = CALayer()
    let width = CGFloat(1.0)
    border.borderColor   = UIColor(red: 188/255, green: 189/255, blue: 192/255 , alpha: 1).CGColor
    border.frame = CGRect(x: 0, y: textField.frame.size.height - width, width:  textField.frame.size.width, height: textField.frame.size.height)
    border.borderWidth = width
    textField.layer.addSublayer(border)
    textField.layer.masksToBounds = true