CALayer subLayer 边界舍入错误?

Posted

技术标签:

【中文标题】CALayer subLayer 边界舍入错误?【英文标题】:CALayer subLayer bounds rounding error? 【发布时间】:2017-06-22 17:38:12 【问题描述】:

下图是使用CAShapeLayer 构建的。灰色层是红色层的子层。

如果您仔细观察灰色层的边缘,您会看到红色层的边缘渗出——就好像灰色层错误地计算了它的宽度一样。这应该是不可能的,因为我将灰色层的宽度设置为正好是红色层的宽度,而灰色层是红色层的子层。当我打印它们的宽度时,它们是完全相同的数字。

有谁知道出了什么问题以及如何解决这个问题?代码如下。

这似乎是某种舍入误差,因为调整帧宽度最终会解决某些值的问题。但这仍然没有意义,因为所有子层的舍入误差应该相同。

class MyLayer 
     var redLayer = CAShapeLayer()
     var grayLayer = CAShapeLayer()

      init() 
         redLayer.addSublayer(graylayer)
      

      func layoutSublayers(_ bounds: CGRect) 
          redLayer.frame = bounds
          grayLayer.frame = CGRect(x: 0, 
                                   y: 0, 
                                   width redLayer.bounds.width, 
                                   height: redLayer.bounds.height/2)
          draw()
      

      func draw() 
        redLayer.fillColor = UIColor.red.cgColor
        redLayer.path = UIBezierPath(rect: redLayer.bounds).cgPath
        grayLayer.fillColor = UIColor.darkGray.cgColor
        grayLayer.path = UIBezierPath(rect: grayLayer.bounds).cgPath
      


【问题讨论】:

【参考方案1】:

设置大小后,尝试在layoutSublayers 内添加灰色层。像这样:

override func layoutSublayers(of layer: CALayer) 
    redLayer.addSublayer(graylayer)

【讨论】:

以上是关于CALayer subLayer 边界舍入错误?的主要内容,如果未能解决你的问题,请参考以下文章

ios新建CALayer

正在使用不同的帧原点绘制 CALayer 子图层。界限问题

如果 CALayer 边界如何独立地 CALayer 图像缩放

在 NSView 边界更改中托管的 CALayer

让CALayer的shadowPath跟随bounds一起做动画改变-b

Swift - 设置 CALayer 边界或框架不起作用