关闭在CALayer.frame周围绘制为CGRect的UIView边框

时间:2018-01-26 15:52:36

标签: swift uiview calayer cgrect

我正在为这样的视图添加边框:

extension UIView {
  func addTopBorderWithColor(color: UIColor, width: CGFloat) {
    let border = CALayer()
    border.backgroundColor = color.cgColor
    border.frame = CGRect(x:0,y: 0, width:self.frame.size.width, height:width)
    self.layer.addSublayer(border)
  }
}

在viewDidLoad中:

textLbl.addTopBorderWithColor(color: UIColor.white, width: 1)

在viewWillAppear中:

textLbl.text = "placeholder text \(variableLengthText)"

如何使用上述扩展程序解除我绘制的边框?

2 个答案:

答案 0 :(得分:0)

  

在其他视图(例如工具栏)中,作为一个草率的黑客,我只会在边框上写一个与对象的背景颜色匹配的边框,这样它就不会重叠(例如在屏幕方向改变时)

嗯,这总是错的,所以要做的第一件事就是停止这样做。

这与viewDidDisappearviewWillAppear无关。视图正在改变大小的信号是它的layoutSubviews被调用。因此,您可以实现layoutSubviews以删除边框图层并添加新尺寸的新图层。

但是在标签上添加子视图会更好,包括除边框之外的清晰背景。这样,可以使用约束来配置子视图,以便与标签一起自动增长和缩小,而无需任何代码。这是一个演示该实现的截屏视频;红线是右边界:

enter image description here

答案 1 :(得分:0)

虽然@ matt的故事板解决方案看起来很优雅,但我无法实现它。然而,我确实通过在扩展中设置layer.name字段并在ViewWillLayoutSubviews中检查它来使其工作

extension UIView {
  func addTopBorderWithColor(color: UIColor, width: CGFloat) {
    let border = CALayer()
    border.backgroundColor = color.cgColor
    border.frame = CGRect(x:0,y: 0, width:self.frame.size.width, height:width)
    border.name = "topBorder"
    self.layer.addSublayer(border)
  }

ViewWillLayoutSubviews我致电:

    if self.textLbl.layer.sublayers != nil {
  for layer in textLbl.layer.sublayers! {
    if layer.name == "rightBorder" || layer.name == "leftBorder" || layer.name == "topBorder" {
      layer.removeFromSuperlayer()
    }
  }
}

ViewDidLayoutSubviews我致电:

textLbl.addTopBorderWithColor(color: UIColor.white, width: 1.5)