UITableViewCell重绘滚动

时间:2015-10-05 15:48:39

标签: ios swift uitableview

我有UITableView包含带滑块和两个标签的单元格,每次滑块离开视图时,它似乎会再次在当前内容的上方绘制。

这是一个解释我的意思的gif。

http://i.imgur.com/4dYtyJy.gifv

以下是相关代码。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let CellIdentifier: String = "\(indexPath.row) - \(indexPath.section)"
    var cell: UITableViewCell! = self.tableView.dequeueReusableCellWithIdentifier(CellIdentifier)

    if cell == nil {
        cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: CellIdentifier)
    }

    let label = UILabel(frame: CGRect(x: 16.0, y: 16.0, width: 300, height: 30.0))
    let percentageLabel = UILabel(frame: CGRect(x: 16.0, y: 0, width: 200.0, height: 30.0))
    let slider = CustomUISlider(frame: CGRect(x: 16.0, y: 55.0, width: 300.0, height: 20.0))

    slider.maximumTrackTintColor = Global().turqTint
    slider.minimumTrackTintColor = Global().blueTint
    slider.minimumValue = 0.0
    slider.maximumValue = 1.0
    slider.value = 0.0
    slider.tag = indexPath.row
    slider.setThumbImage(UIImage(named: "sliderThumbImage"), forState: .Normal)
    slider.addTarget(self, action: "sliderValueChanged:", forControlEvents: .ValueChanged)

    label.text = Array(selectedTypes)[indexPath.row].1

    percentageLabel.text = "\(slider.value)"
    percentageLabel.tag = indexPath.row

    cell.tintColor = Global().tintColor
    cell.addSubview(label)
    cell.addSubview(slider)
    cell.addSubview(percentageLabel)

    return cell
}

3 个答案:

答案 0 :(得分:0)

我遇到过类似的问题。正如Horst在评论中所说的那样,将该片段放入块中就可以解决问题了:

if (cell == nil)
{
    // Code that draws frames
}

答案 1 :(得分:0)

如果你坚持按照自己的方式行事,你会想要更喜欢的东西 (注意"\(indexPath.row) - \(indexPath.section)")这将为每个单元格创建不同的CellID。您希望有一些常见的CellID能够从TableView的重用逻辑中受益:

//Global constants for the View tags
let textLabelTag = 1
let percentageLabelTag = 2
let sliderTag = 3

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let CellIdentifier: String = "SomeUniqueID"
    var cell: UITableViewCell! = self.tableView.dequeueReusableCellWithIdentifier(CellIdentifier)

    if cell == nil {
        cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: CellIdentifier)
        self.createUIforCell(cell);
    }

    self.configureCell(cell, indexPath: indexPath)

    return cell
}
  1. 为单元格创建UI组件并将其添加为子视图。如果单元格不存在,则只调用此方法一次:

    func createUIforCell(cell: UITableViewCell) {
    
       let textLabel = UILabel(frame: CGRect(x: 16.0, y: 16.0, width: 300, height: 30.0))
       textLabel.tag = textLabelTag
       cell.addSubview(textLabel)
    
       let percentageLabel = UILabel(frame: CGRect(x: 16.0, y: 0, width: 200.0, height: 30.0))
       percentageLabel.tag = percentageLabelTag
       cell.addSubview(percentageLabel)
    
       let slider = CustomUISlider(frame: CGRect(x: 16.0, y: 55.0, width: 300.0, height: 20.0))
       slider.tag = sliderTag
       slider.maximumTrackTintColor = Global().turqTint
       slider.minimumTrackTintColor = Global().blueTint
       slider.minimumValue = 0.0
       slider.maximumValue = 1.0
       slider.setThumbImage(UIImage(named: "sliderThumbImage"), forState: .Normal)
       slider.addTarget(self, action: "sliderValueChanged:", forControlEvents: .ValueChanged)
       cell.addSubview(slider)
    }
    
  2. 使用正确的数据更新用户界面:

    func configureCell(cell: UITableViewCell, indexPath: NSIndexPath) {
    
        let textLabel: UILabel = cell.viewWithTag(textLabelTag) as! UILabel
        textLabel.text = Array(selectedTypes)[indexPath.row].1
    
        let slider: CustomUISlider = cell.viewWithTag(sliderTag) as! CustomUISlider
        slider.value = 0.0
    
        let percentageLabel: UILabel = cell.viewWithTag(percentageLabelTag) as! UILabel
        percentageLabel.text = "\(slider.value)"
    
    }
    
  3. 注意:如果您有自己的UITableViewCell子类,要创建的UI(在代码中或在.xib中),它会更清晰

答案 2 :(得分:0)

您应该继承UITableViewCell并覆盖prepeareForReuse方法。有了它,您可以将单元格设置为默认模式。

-(void)prepareForReuse {
    [super prepareForReuse];

    //Reset your cell here to default state.
}