添加自定义 UIView class 到自定义 UICollectionViewCell 有不同的结果

Adding custom UIView class to custom UICollectionViewCell have different results

这可能不是最好的实施方式,所以我愿意接受其他建议。

我想创建一个 UICollectionView,它有一个自定义的 UIView 画一个圆(类似于手表的 Activity 圆。我遇到的问题是,在每个 cell 在第一个显示的(必须滚动)之后,圆圈被绘制在左上角的圆圈而不是居中,大小错误,我不确定我需要更改什么。

UIView class

    let shapeLayer = CAShapeLayer()
    
    override func draw(_ rect: CGRect) {
        
        
        var path = UIBezierPath()
        path = UIBezierPath(arcCenter: self.center, radius: (self.frame.height / 2)-10, startAngle: -CGFloat.pi / 2, endAngle: (2 * CGFloat.pi - CGFloat.pi / 2), clockwise: true)
        shapeLayer.path = path.cgPath
        
        
        shapeLayer.lineWidth = 6
        shapeLayer.fillColor = UIColor.clear.cgColor
        shapeLayer.lineCap = .round
        
        shapeLayer.strokeEnd = 0
        
        self.layer.addSublayer(shapeLayer)
    }
    
    func setProgress(progress: NSNumber) {
        let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")

        basicAnimation.toValue = progress

        basicAnimation.duration = 1

        basicAnimation.fillMode = .forwards
        basicAnimation.isRemovedOnCompletion = false

        shapeLayer.add(basicAnimation, forKey: "setProgress")
    }
    
    func setColor(color: UIColor) {
        shapeLayer.strokeColor = color.cgColor
    }

UICollectionViewCell

@IBOutlet weak var view: CustomViewClass!

var key: String!

我使用故事板将 CustomViewClass 连接到 UIView。

您正在 override func draw(_ rect: CGRect) { 中绘制圆,在创建或显示视图时调用一次。那时框架(原点,大小)还没有通过自动布局计算出来。

cell for row atIndex 中设置单元格时需要再次 re-draw 圆圈。