我正在尝试将 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 不再存在,我如何保持图层彼此对齐?
您应该使用
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))