Смещенная граница вокруг вида - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь создать границу вокруг вида. Для этого я создаю слой с 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)
  }
}

Device

Вот конфигурация раскадровки, если кому-то интересно, что ограничения могут быть неправильными:

Storyboard

View debugger

1 Ответ

0 голосов
/ 01 марта 2020

Мне удалось это решить, хитрость заключалась в том, чтобы поместить реализацию границы в 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)
  }
...