我正在尝试使用CAShapeLayer
在具有特定属性的每个UITableViewCell
上绘制一个实心圆圈(如果bool属性为true)。我使用CAShapeLayer
的原因是我可以在以后制作动画。
当tableView最初渲染出来时,它可以正常工作。但是,当添加或删除单元格时出现问题,严重错误!圆圈被绘制在错误的单元格中,有时在单元格外部(下方)。我不知道出了什么问题。由于在单元格上设置clipsToBounds
,它似乎已经阻止了在单元格之外绘制的圆圈,但是这仍然无法解决某些被绘制的问题/某些不被解决的问题。
以下代码(据说)绘制了一个实心圆圈。它存在于我的自定义UITableViewCell
类中:
let radius = 15
self.circleLayerForAnimation = CAShapeLayer()
self.circleLayerForAnimation!.path = UIBezierPath(roundedRect: CGRectMake(CGFloat(0), CGFloat(0), CGFloat(2*radius), CGFloat(2*radius)), cornerRadius: CGFloat(radius)).CGPath
self.circleLayerForAnimation!.position = CGPointMake(CGRectGetMidX(CGRectMake(self.frame.width - 20.0 - 30.0, 15.0, 30.0, 30.0)) - CGFloat(radius), CGRectGetMidY(self.frame)-CGFloat(radius))
self.circleLayerForAnimation!.contentsScale = UIScreen.mainScreen().scale
self.circleLayerForAnimation!.fillColor = UIColor.blueColor().CGColor
self.circleLayerForAnimation!.strokeColor = UIColor.blueColor().CGColor
self.circleLayerForAnimation!.lineWidth = 1
self.contentView.layer.addSublayer(self.circleLayerForAnimation)
在我的表视图控制器中,我有以下代码在cellForRowAtIndexPath
函数中绘制/删除圆圈:
if (shouldShowCircle == true) {
if (cell!.circleLayerForAnimation == nil) {
cell!.fillCircle() // code above
}
} else {
if (cell!.circleLayerForAnimation != nil) {
cell!.circleLayerForAnimation!.removeFromSuperlayer()
cell!.circleLayerForAnimation = nil
}
}
有人可以帮忙,因为这过去几个小时让我发疯了!
由于
答案 0 :(得分:1)
尝试在显示单元格时运行动画。
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
答案 1 :(得分:0)
我的问题在于框架。替换:
self.circleLayerForAnimation!.position = CGPointMake(CGRectGetMidX(CGRectMake(self.frame.width - 20.0 - 30.0, 15.0, 30.0, 30.0)) - CGFloat(radius), CGRectGetMidY(self.frame)-CGFloat(radius))
使用:
self.circleLayerForAnimation!.position = CGPointMake(CGRectGetMidX(CGRectMake(self.contentView.frame.width - 20.0 - 30.0, 15.0, 30.0, 30.0)) - CGFloat(radius), CGRectGetMidY(self.contentView.frame)-CGFloat(radius))
按预期生成结果。