tableViewCell中的UIBezierPath冲突单元格之间的边界

时间:2018-12-05 17:27:56

标签: ios swift

我有一个ViewController,那个ViewController有一个tableView。这个tableView可以具有处于四个状态的单元格,我需要其中两个在其中具有虚线边框的UIView,这是因为我在下面使用了UIBazierPath az:

private func setIconContainerViewBorder(dashed: Bool, _color: CGColor) {
    if dashed {
        let _border = CAShapeLayer()
        _border.lineDashPattern = [5, 4]
        _border.fillColor = nil
        _border.lineWidth = 2
        _border.strokeColor = _color
        _border.frame = self.iconContainerView.bounds
        _border.path = UIBezierPath(roundedRect: self.iconContainerView.bounds, cornerRadius: self.iconContainerView.frame.height / 2).cgPath
        self.iconContainerView.layer.addSublayer(_border)
    } else {
        self.iconContainerView.layer.cornerRadius = self.iconContainerView.frame.height / 2
        self.iconContainerView.layer.borderWidth = 2
        self.iconContainerView.layer.borderColor = _color
    }
}

问题是,当我删除表格单元格或将其添加到tableview时(我将present模态地转到另一个视图控制器,并且在关闭该viewController并返回到该viewController之后,某些单元格的边框被弄乱了,见下文:

图片1

Screen Shot

图片2

Screen Shot

图片3

Screen Shot

我测试了我能想到的一切,重新加载tableview,删除行并再次插入,但是没有任何效果。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

表视图重用单元格。每次重复使用单元格且reindex为true时,您将添加另一个CAShapeLayer。即使在以后将单元格重新用于非虚线图标时,这些形状层仍然保留。

您应该制作一个dashed子类来处理形状层。 UIView应该是该子类的实例,并具有引用形状层的实例变量。

答案 1 :(得分:0)

private func setIconContainerViewBorder(dashed: Bool, _color: CGColor) {
    if let _sublayers = self.iconContainerView.layer.sublayers {
        for _sublayer in _sublayers {
            if let _caShapeLayer = _sublayer as? CAShapeLayer {
                _caShapeLayer.removeFromSuperlayer()
            }
        }
    }

    self.iconContainerView.layer.borderColor = UIColor.clear.cgColor
    self.iconContainerView.layer.borderWidth = 0

    if dashed {
        let _border = CAShapeLayer()
        _border.lineDashPattern = [5, 4]
        _border.fillColor = nil
        _border.lineWidth = 2
        _border.strokeColor = _color
        _border.frame = self.iconContainerView.bounds
        _border.path = UIBezierPath(roundedRect: self.iconContainerView.bounds, cornerRadius: self.iconContainerView.frame.height / 2).cgPath
        self.iconContainerView.layer.addSublayer(_border)
    } else {
        self.iconContainerView.layer.cornerRadius = self.iconContainerView.frame.height / 2
        self.iconContainerView.layer.borderWidth = 2
        self.iconContainerView.layer.borderColor = _color
    }
}