CAShapeLayer无法按需呈现

问题描述

我认为其中有一些CAShapeLayer。我懒惰地实例化如下:

lazy var myViewWithLayersOnIt: UIView = {
    let view = UIView(frame: CGRect(origin: CGPoint(x: 14,y: 2),size: CGSize(width: 10,height: 10)))
    view.translatesAutoresizingMaskIntoConstraints = false

    let outerCircleLayer = CAShapeLayer()
    let outerPath = UIBezierPath(ovalIn: view.frame).cgPath
    outerCircleLayer.path = outerPath
    outerCircleLayer.position = view.center
    outerCircleLayer.fillColor = UIColor.white.cgColor
    view.layer.addSublayer(outerCircleLayer)

    let innerFrame = CGRect(origin: CGPoint(x: 1.5,y: 1.5),size: CGSize(width: 8.5,height: 8.5))
    let innerCircleLayer = CAShapeLayer()
    let innerPath = UIBezierPath(ovalIn: innerFrame).cgPath
    innerCircleLayer.path = innerPath
    innerCircleLayer.position = view.center
    innerCircleLayer.fillColor = UIColor.red.cgColor
    view.layer.addSublayer(innerCircleLayer)

    return view
}()

本应呈现在屏幕上的所有内容都在呈现时,CAShapeLayer不在view的中央。我认为这可能是由于延迟实例化导致的,所以我放弃了懒惰,并且看到了完全相同的问题。我忘了做什么?

这是它的呈现方式:

enter image description here

感谢您的阅读。我欢迎您的投入。

解决方法

对于view.bounds,您应该使用view.frame而不是outerPath。无需设置position的{​​{1}},也无需设置outerCircleLayer

innerCircleLayer

结果:

circles centered inside each other

红色圆圈偏离中心,因为

lazy var myViewWithLayersOnIt: UIView = {
    let view = UIView(frame: CGRect(origin: CGPoint(x: 14,y: 2),size: CGSize(width: 10,height: 10)))
        

    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = UIColor.black

    let outerCircleLayer = CAShapeLayer()
    let outerPath = UIBezierPath(ovalIn: view.bounds).cgPath /// bounds!
    outerCircleLayer.path = outerPath
//    outerCircleLayer.position = view.center
    outerCircleLayer.fillColor = UIColor.white.cgColor
    view.layer.addSublayer(outerCircleLayer)

    let innerFrame = CGRect(origin: CGPoint(x: 1.5,y: 1.5),size: CGSize(width: 8.5,height: 8.5))
    let innerCircleLayer = CAShapeLayer()
    let innerPath = UIBezierPath(ovalIn: innerFrame).cgPath
    innerCircleLayer.path = innerPath
//    innerCircleLayer.position = view.center
    innerCircleLayer.fillColor = UIColor.red.cgColor
    view.layer.addSublayer(innerCircleLayer)

    return view
}()

应该是

let innerFrame = CGRect(origin: CGPoint(x: 1.5,height: 8.5))

8.5 + 0.75 + 0.75 = 10,而不是8.5 + 1.5 + 1.5 = 11.5

red circle's center fixed