我不明白为什么下面的代码并没有将圆圈完全放在图像中心

时间:2017-12-13 19:49:05

标签: ios uicollectionview uicollectionviewcell

我不明白为什么要关注代码,不要将圆圈完全放在图像中心。

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

Horizontal UICollectionView spanning on one line. Each cell is a face

1 个答案:

答案 0 :(得分:2)

您将路径偏移两次:一次在路径中,一次在形状图层中。你可能也不想要。

形状层的路径相对于形状层的坐标系,而形状层的框架相对于其超级层的坐标系(图像视图' s层)。

对于这两者,你要指定图像视图的帧,这是一个与其超视图有一些偏移的值;单元格的内容视图。

这对您的代码来说意味着两件事:

由于形状图层的框架相对于其超级图层(图像视图的图层),如果您希望图形视图位于图像视图的左上角,那么您应该将形状图层的框架设置为图像视图的边界(或者只是一个原点为零且尺寸与图像视图相同的矩形)。

layer.frame = vi.bounds

由于形状图层的路径是相对于形状图层的,因此如果要绘制一个填充形状图层的圆,那么您的路径应该是形状图层中的椭圆 边界

let circle = UIBezierPath(ovalIn: layer.bounds)