在自定义 UITextField class 中绘制 (_ rect: CGRect) 不要调用 ios 14

draw(_ rect: CGRect) in custom UITextField class don't call on ios 14

我在自定义 UITextField class 中使用 draw(_ rect: CGRect)。 绘图功能适用于 IOS 13,但不适用于 IOS 14。 我在 init 中添加了 setNeedsDisplay() 但在使用 setNeedsDisplay()

后仍然不起作用
func setup() {
    let border = CALayer()
    let width = CGFloat(2.0)
    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
}

override init(frame: CGRect) {
    super.init(frame: frame)
    setNeedsDisplay()
    
}

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setNeedsDisplay()
}

public override func draw(_ rect: CGRect) {
    setup()
    self.backgroundColor = .red
}

您不应在 layoutSubviews 或 Draw 函数中添加任何内容

 private lazy var border : CALayer = {
    let layer = CALayer()
    layer.borderWidth = CGFloat(2.0)
    return layer
}()


 override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    
  private func commonInit(){
             setup() 
            self.backgroundColor = .red
        }


  public override func layoutSubviews() {
        
         border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height)
         
      }

  private  func setup() {
       self.layer.addSublayer(border)
       self.layer.masksToBounds = true

      }

将绘图函数更改为 didMoveToWindows

总是问我:)

override func didMoveToWindow() {
     self.layer.addSublayer(border)
     self.layer.masksToBounds = true
}