CAShapeLayer问题 - 没有在UITableViewCell中绘图

时间:2014-08-22 18:43:54

标签: ios uitableview swift cashapelayer

我正在尝试使用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
        }  
    }

有人可以帮忙,因为这过去几个小时让我发疯了!

由于

2 个答案:

答案 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))

按预期生成结果。