我不明白为什么要关注代码,不要将圆圈完全放在图像中心。
let face = collectionView.dequeueReusableCell(withReuseIdentifier: "myFace", for: indexPath) as! Face
print("face cellForItemAt \(indexPath) and frame \(face.frame)")
face.tag = indexPath.row
let _ = face.contentView.subviews.map({$0.removeFromSuperview})
let ind = indexPath.row
let vi = UIImageView()
vi.frame = face.contentView.frame
vi.image = UIImage(cgImage: panim[ind])
let layer = CAShapeLayer()
layer.frame = vi.frame
let circle = UIBezierPath(ovalIn: vi.frame)
circle.append(UIBezierPath(rect: vi.frame))
circle.usesEvenOddFillRule = false
layer.path = circle.cgPath
layer.fillColor = UIColor.red.withAlphaComponent(0.0).cgColor
layer.strokeColor = UIColor.yellow.cgColor
layer.fillRule = kCAFillRuleNonZero
vi.layer.addSublayer(layer)
face.contentView.addSubview(vi)
return face
答案 0 :(得分:2)
您将路径偏移两次:一次在路径中,一次在形状图层中。你可能也不想要。
形状层的路径相对于形状层的坐标系,而形状层的框架相对于其超级层的坐标系(图像视图' s层)。
对于这两者,你要指定图像视图的帧,这是一个与其超视图有一些偏移的值;单元格的内容视图。
这对您的代码来说意味着两件事:
由于形状图层的框架相对于其超级图层(图像视图的图层),如果您希望图形视图位于图像视图的左上角,那么您应该将形状图层的框架设置为图像视图的边界(或者只是一个原点为零且尺寸与图像视图相同的矩形)。
layer.frame = vi.bounds
由于形状图层的路径是相对于形状图层的,因此如果要绘制一个填充形状图层的圆,那么您的路径应该是形状图层中的椭圆 边界
let circle = UIBezierPath(ovalIn: layer.bounds)