Reputation: 1090
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.
Upvotes: 0
Views: 192
Reputation: 1090
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.
Upvotes: 0