问题描述
我认为其中有一些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
的中央。我认为这可能是由于延迟实例化导致的,所以我放弃了懒惰,并且看到了完全相同的问题。我忘了做什么?
这是它的呈现方式:
感谢您的阅读。我欢迎您的投入。
解决方法
对于view.bounds
,您应该使用view.frame
而不是outerPath
。无需设置position
的{{1}},也无需设置outerCircleLayer
。
innerCircleLayer
结果:
红色圆圈偏离中心,因为
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