tableview滚动得到错误的最后一个单元格

时间:2018-06-22 03:39:15

标签: ios swift uitableview

我正在尝试重新创建Facebook设置页面

这是Facebook设置页面的外观:

https://gfycat.com/SizzlingSorrowfulGrayfox

我已经开始了一个新项目,该项目仅使用1个表格视图,具有样式分组,节和标题。

我想四舍五入表格视图的每个部分。我必须四舍五入标题的左上角和右上角(该部分的顶部),最后一个单元格的左下角和右下角(该部分的底部)。

我已经使用HeaderTableViewCell中的以下代码完成了顶部:

let rectShape = CAShapeLayer()
rectShape.bounds = self.frame
rectShape.position = self.center
rectShape.path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: 10, height: 10)).cgPath
self.layer.mask = rectShape

但是,当我对最后一个单元格执行同样的操作时,会发生奇怪的事情。

https://gfycat.com/UnselfishCommonFlee

第一次加载页面时,角部已正确倒圆,但是当我上下滚动时,倒数第二个单元格已变圆。

这是我的代码,用于舍入cellForRowAt中的最后一个单元格:

if indexPath.row + 1 == childArray?.count { //last cell, set corner radius

    print("is last cell")
    let rectShape = CAShapeLayer()
    rectShape.bounds = rowDataCell.frame
    rectShape.position = rowDataCell.center
    rectShape.path = UIBezierPath(roundedRect: rowDataCell.bounds, byRoundingCorners: [.bottomLeft , .bottomRight], cornerRadii: CGSize(width: 10, height: 10)).cgPath
    rowDataCell.layer.mask = rectShape
}else{
    rowDataCell.layer.cornerRadius = 0
}

有帮助吗?

2 个答案:

答案 0 :(得分:3)

单元被重用。您有条件设置的所有属性都必须重置。

您为最后一个单元格设置了图层的mask,但是当该单元格不是最后一个单元格时,您没有清除该掩码。

if indexPath.row + 1 == childArray?.count { //last cell, set corner radius
    print("is last cell")
    let rectShape = CAShapeLayer()
    rectShape.bounds = rowDataCell.frame
    rectShape.position = rowDataCell.center
    rectShape.path = UIBezierPath(roundedRect: rowDataCell.bounds, byRoundingCorners: [.bottomLeft , .bottomRight], cornerRadii: CGSize(width: 10, height: 10)).cgPath
    rowDataCell.layer.mask = rectShape
}else{
    rowDataCell.layer.mask = nil
}

答案 1 :(得分:0)

这是解决此问题的简便方法,只需在表格视图单元格的末尾添加此行代码 rowDataCell.layer.mask = nil