首页 > 解决方案 > 视图周围未对齐的边框

问题描述

我正在尝试在视图周围创建边框。为此,我正在创建一个具有视图大小的 UIBezierPath 的图层,并使用描边颜色创建另一个图层。然后我将贝塞尔图层分配给描边颜色图层并将其作为子图层添加到视图中。

有没有人遇到过这个问题?

class ViewController: UIViewController {

  @IBOutlet weak var rectangleView: UIView!

  override func viewDidLoad() {
    super.viewDidLoad()

    let bezierLayer = CAShapeLayer()
    bezierLayer.bounds = rectangleView.frame
    bezierLayer.position = rectangleView.center
    bezierLayer.path = UIBezierPath(rect: rectangleView.bounds).cgPath

    let borderLayer = CAShapeLayer()
    borderLayer.bounds = rectangleView.frame
    borderLayer.position = rectangleView.center
    borderLayer.fillColor = UIColor.clear.cgColor
    borderLayer.strokeColor = UIColor.black.cgColor
    borderLayer.lineWidth = 1

    borderLayer.path = bezierLayer.path

    rectangleView.layer.addSublayer(borderLayer)
  }
}

设备

如果有人想知道约束可能是错误的,这里是故事板配置:

故事板

查看调试器

标签: iosswiftxcodeuitextfieldcashapelayer

解决方案


我能够解决它,诀窍是viewDidLayoutSubviews像这样放置边界实现:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    rectangleView.layer.sublayers?.forEach {
      guard let layer = $0 as? CAShapeLayer else { return }
      layer.removeFromSuperlayer()
    }

    let bezierLayer = CAShapeLayer()
    bezierLayer.frame = rectangleView.bounds
    bezierLayer.path = UIBezierPath(rect: rectangleView.bounds).cgPath

    let borderLayer = CAShapeLayer()
    borderLayer.frame = rectangleView.bounds
    borderLayer.fillColor = UIColor.clear.cgColor
    borderLayer.strokeColor = UIColor.black.cgColor
    borderLayer.lineWidth = 1

    borderLayer.path = bezierLayer.path

    rectangleView.layer.addSublayer(borderLayer)
  }

推荐阅读