JTAppleCalendar - how to stop cells for randomly repeating?

186 views Asked by At

I am drawing a circle in cellForItemAt method as follows for a particular condition:

    if cellState.date == CalendarModel.DUE_DATE {
        let shapeLayer = CAShapeLayer()

        let circlePath = UIBezierPath(arcCenter: CGPoint(x: (cell.layer.frame.size.width)/2,y: (cell.layer.frame.size.height)/2), radius: CGFloat(15), startAngle: CGFloat(0), endAngle:CGFloat(Double.pi * 2), clockwise: true)


        shapeLayer.path = circlePath.cgPath

        //change the fill color
        shapeLayer.fillColor = UIColor.clear.cgColor
        //you can change the stroke color
        shapeLayer.strokeColor = UIColor.FlatColor.Blue.midnightBlue.cgColor
        //you can change the line width
        shapeLayer.lineWidth = 1.0
        cell.layer.addSublayer(shapeLayer)
    }

The circle keeps repeating randomly. I'm trying the following code in willDisplayCell however it removes all content from the cell.

func calendar(_ calendar: JTAppleCalendarView, willDisplay cell: JTAppleCell, forItemAt date: Date, cellState: CellState, indexPath: IndexPath) {
    // comment
    cell.layer.sublayers?.forEach { $0.removeFromSuperlayer() }
}

How to specifically remove the shapeLayer that was added in cellForItemAt? Any help would be greatly appreciated. Thank you.

1

There are 1 answers

0
as diu On

as per @Paulw11 's suggestion, I subclassed the JTAppleCell and added a variable as follows:

    var shapeLayer : CAShapeLayer!

Then added another method in the same JTAppleCell's subclass as below:

func addCircle() {
    self.shapeLayer = CAShapeLayer()
    let circlePath = UIBezierPath(arcCenter: CGPoint(x: (self.layer.frame.size.width)/2,y: (self.layer.frame.size.height)/2), radius: CGFloat(15), startAngle: CGFloat(0), endAngle:CGFloat(Double.pi * 2), clockwise: true)
    shapeLayer.path = circlePath.cgPath
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.strokeColor = UIColor.FlatColor.Blue.cgColor
    shapeLayer.lineWidth = 1.0
    self.layer.addSublayer(shapeLayer)
}

in cellForItemAt I added the following lines after dequeueing the cells in an else block:

if cell.shapeLayer != nil {
      cell.shapeLayer.removeFromSuperlayer()
      cell.shapeLayer = nil
}

Thank you @Paulw11 the above solution worked for me.