CAShapeLayer 与 UIVIew 的 CALayer 的偏移

问题描述 投票:0回答:1

我正在尝试将 CAShapeLayer 添加到自定义 UIViews 层,进展顺利,除了它自身偏移这一事实......

我可能最好用代码和屏幕截图来解释。所以这里是:

我想要实现的只是一个简单的“斜杠”,就像 Swift 3 中的 CAShapeLayer 一样。

在自定义 UIView 中我有:

    var slashLayer: CAShapeLayer?
var slashPath: CGPath?

override func layoutSublayers(of layer: CALayer) {
    if layer == self.layer {
        if slashLayer == nil {
            slashLayer = CAShapeLayer()
            slashLayer?.bounds = layer.bounds
            slashLayer?.strokeColor = UIColor.black.cgColor
            slashLayer?.fillColor = UIColor.black.cgColor
            slashLayer?.lineWidth = 3.0

            let slashPath = UIBezierPath()
            slashPath.move(to: CGPoint(x: layer.frame.minX, y: layer.frame.minY))
            slashPath.addLine(to: CGPoint(x: layer.frame.maxX, y: layer.frame.maxY))
            slashPath.close()

            slashLayer?.path = slashPath.cgPath

            layer.addSublayer(slashLayer!)
        }
    }
}

这就是 UIView 子类中的内容。

这就是我在 Interface Builder 中得到的结果(以及当我启动它时的应用程序)..

由于 CALayer.layoutManager 不再存在,我如何保持图层彼此对齐?

uiview
1个回答
0
投票

您应该使用

layer.bounds
而不是
layer.frame
,因为在您的情况下
layer.frame
代表自定义 UIView 在其父视图坐标系中的位置+大小。但是,您的 CAShapeLayer 子图层位于您的自定义 UIView 的坐标系内。

slashPath.move(to: CGPoint(x: layer.bounds.minX, y: layer.bounds.minY))
slashPath.addLine(to: CGPoint(x: layer.bounds.maxX, y: layer.bounds.maxY))
© www.soinside.com 2019 - 2024. All rights reserved.