UTableViewCell子视图中的drawRect仅在选择单元格时有效

时间:2016-02-18 05:12:36

标签: ios swift uitableview uiview

我有一个自定义UIView,在其drawRect方法中绘制了几行。然后,我创建了一个常规UITableViewCell并将自定义UIView添加到其中。我的自定义UIView中的绘图代码仅在选择了表格视图单元格时显示。一旦取消选择,所有的线条都会消失。

我已迫使setNeedsDisplay在运行时被多次调用以进行测试。不幸的是,这没有任何区别。如果未选择单元格,则不会显示这些行。

有什么想法吗?

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = createEmptyCell()
        let selectionView = SelectionView(frame: cell.bounds)
        childSelectionView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        cell.addSubview(childSelectionView)
        return cell
}

这是空类

上的drawRect方法
override func drawRect(rect: CGRect) {
    super.drawRect(rect)
    let path = UIBezierPath()
    path.moveToPoint(CGPoint(x: 20,y: 50))
    path.addLineToPoint(CGPoint(x: bounds.width / 2 - 4, y: 50))
    path.addLineToPoint(CGPoint(x: bounds.width / 2, y: 58))
    path.addLineToPoint(CGPoint(x: bounds.width / 2 + 4, y: 50))
    path.addLineToPoint(CGPoint(x: bounds.width - 20,y: 50))
    path.lineWidth = 1
    UIColor.blackColor().setStroke()
    path.stroke()
}

2 个答案:

答案 0 :(得分:0)

这必须有其他的东西。我刚刚在iOS 9.2上使用Xcode 7.2.1和Swift 2.2进行了测试,它按预期工作(此图中的红线)。

enter image description here

请注意,您选择的视图与不选择的视图之间的区别在于,当您选择该视图时,该视图将设置您视图的背景颜色清除以便显示backgroundView。然后,当不再选择单元格时,将恢复视图的颜色。它对contentView层次结构中的所有视图执行此操作。我在故事板中将测试视图的背景颜色设置为透明的红色来演示这一点。

答案 1 :(得分:0)

感谢您发布一些代码。

首先,调用名为createEmptyCell()的方法。这可能是错误的做法。您必须使用dequeueReusableCellWithIdentifier()来获取您的手机。只需直接从tableView(_:cellForRowAtIndexPath:)委托方法调用它即可。

其次,永远不要将子视图添加到tableView(_:cellForRowAtIndexPath:)的单元格中。使用dequeueReusableCellWithIdentifier()后,您将重复使用单元格,并且您将反复添加相同的视图,从而导致视觉和性能问题。

您希望子类化UITableViewCell并将您的子视图添加到init(style:reuseIdentifier:)或故事板中的原型单元格中,或者从xib文件中添加。

我没有测试过您的drawRect()代码,但它看起来应该可以正常工作。如果你想在GitHub上发布一个示例项目,我很乐意帮你调试它。