Swift UITextField Border扩展

时间:2018-09-16 13:22:14

标签: swift

我正在使用以下扩展程序,以便在各种视图控制器中的各个文本字段周围绘制蓝​​线

extension UITextField{
  open override func draw(_ rect: CGRect) {
      self.layer.cornerRadius = 9.0
      self.layer.borderWidth = 0.5
      self.layer.borderColor = UIColor(red: 0.0/255.0, green: 122.0/255.0, blue: 255.0/255.0, alpha: 1.0).cgColor
      self.layer.masksToBounds = true
    }
}

这很完美,但是现在我想从中排除一些特定的文本字段。
例如,视图控制器类MainMenuController上的@IBOutlet weak var dateTextField: UITextField!应该具有红色边框,而同一视图控制器上的其他文本字段仍应显示蓝色边框。 有没有一种方法可以将扩展名限制为某些文本字段? 非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

  

有没有办法限制扩展名

不。因此,这始终是一种糟糕的方法。代替扩展,使用子类。

此外,扩展名中的覆盖是非法的。这根本不应该起作用。

此外,覆盖文本字段的draw方法是非法的。而且即使是合法的,这样做也不对,因为您没有在画图。 draw被多次调用以进行绘制,但这只是您要在文本字段的属性中一次一次进行的一次更改。编写子类时,请覆盖文本字段的初始化程序。

因此,假设您所有的文本字段都来自情节提要(例如您的dateTextField。那么您应该编写:

class BorderedTextField : UITextField {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder:aDecoder)
        self.layer.cornerRadius = 9.0
        self.layer.borderWidth = 0.5
        self.layer.borderColor = UIColor(red: 0.0/255.0, green: 122.0/255.0, blue: 255.0/255.0, alpha: 1.0).cgColor
        self.layer.masksToBounds = true
    }
}

然后使用情节提要中的身份检查器将您的文本字段从UITextField转换为BorderedTextField。

您还可以使用@IBInspectable属性来将边框颜色设置为情节提要板本身中的设置。但这将超出问题的范围。