TableView reloadData重置标题单元格中的scrollView contentOffset

时间:2015-08-28 12:13:44

标签: swift tableview cell

我有一个带有两个自定义单元格的tableView。一个用于标题,一个用于tableView中的单元格。

标题单元格如下所示:

Label         Label         ScrollView(inside scrollView is an imageView)

另一个单元格如下:

Label         TextField    ScrollView(inside scrollView is an imageView)

当我水平滚动一个单元格时,所有其他单元格(包括标题单元格)将获得相同的contentOffset。这就像一个魅力。

我添加了另一个函数,它在除了标题cel之外的所有单元格的现有imageView顶部的scrollView中添加了另一个imageView。在新的imageView中,我添加了一个可拖动的行。这是通过longPressureGesture实现的。在这个手势里面,我需要做一个tableView.reloadData(),这样每次线移动时都会更新所有单元格。 LongPressureGesture允许我在执行reloadData()时执行此操作而不会失去对行的控制。

但这是我的问题: 在调用longPressureGesture中的reloadData()之后,headerCell内的scrollView的contentOffset被重置。但是单元格中所有其他scrollView的contentOffset仍然是相同的。

我尝试在headerCell中添加contentOffset,以便每次调用reloadData时都会设置contentOffset。但这不起作用,因为contentOffset将被提前调用并且没有效果。

如果我添加一个延迟,然后再次设置contentOffset它正在工作。但这最终导致闪烁,这是不好的。

编辑:试图只使用一个单元格(用于标题的单元格而不是特定的标题单元格)。结果相同。那么这是tableView中标题的一般问题吗?

我的细胞代码是:

/*
 * This method fills all the given information for each signal to a custom cell by type SignalCell.
 * Each cell has a signalName, a value at specific time and a wave image.
 */
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! SignalCell
    cell.delegate = self

    // Get the signal for this row
    let signal = VCDHelper.sharedInstance.signals[indexPath.row] as! VCDSignal

    // Set the name of the signal to the label
    cell.signalLabel.text = signal.name
    cell.name = signal.name

    // cellContainer is set inside renderWave every time a new Cell appears
    renderTimePicker(cell, signal: signal, indexPath: indexPath)
    renderWave(cell, signal: signal, indexPath: indexPath)

    cellContainer.setObject(cell, forKey: signal.name)

    return cell
}

标题代码:

// Display header cell
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let cell = tableView.dequeueReusableCellWithIdentifier(cellHeaderIdentifier) as! HeaderCell

    // Add object to renderer dictionary
    var headerRenderer = headerToRender.objectForKey("header") as? TimeRenderer

    // Render waves
    if let headerRenderer = headerRenderer {
        cell.timeImageView.image = headerRenderer.renderedTime()
    } else {
        // There is no renderer yet
        headerRenderer = TimeRenderer()
        headerToRender.setObject(headerRenderer!, forKey: "header")

        // Creates and returns an NSBlockOperation object with block
        let operation = NSBlockOperation(block: { () -> Void in
            let renderedHeaderImage = headerRenderer!.renderedTime()
            NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                cell.timeImageView.image = renderedHeaderImage
                cell.cellContainer = self.cellContainer
            })
        })

        queue.addOperation(operation)
        headerToRenderOperations.setObject(operation, forKey: "header")
    }

    cellContainer.setObject(cell, forKey: "header")

    return cell
}

这里是为在SignalCell类中实现的每个Cell保存/设置contentOffset的代码:

/*
 * This method allows only horizontal scrolling.
 * It also handles that scrolling out of bounds is not allowed
 */
func scrollViewDidScroll(scrollView: UIScrollView) {
    // Set contentOffsetX to minimum bound value because we are out of range
    if scrollView.contentOffset.x < 0 {
        scrollCells(scrollView, contentOffsetX: 0.0)
        VCDHelper.sharedInstance.waveScrollContentOffsetX = 0.0
    }

    if scrollView.contentOffset.x > 0 {
        // ContentOffsetX is the point at the beginning of the scrollView
        // We know the total size of the image and need to subtract the size of the scrollView
        // This will result in the max contentOffset.x for scrolling
        if scrollView.contentOffset.x <= CGFloat(VCDHelper.sharedInstance.imageWidth) - scrollView.bounds.width {
            scrollCells(scrollView, contentOffsetX: scrollView.contentOffset.x)
            VCDHelper.sharedInstance.waveScrollContentOffsetX = Float(scrollView.contentOffset.x)
        } else {
            // Set contentOffsetX to maximal bound value because we are out of range
            scrollCells(scrollView, contentOffsetX: CGFloat(VCDHelper.sharedInstance.imageWidth) - scrollView.bounds.width)
        }
    }
}

/*
 * This method scrolls all visible images inside the scrollView at once
 */
func scrollCells(scrollView: UIScrollView, contentOffsetX: CGFloat) {
    for (key, cell) in self.cellContainer {
        if key as! String == "header" {
            let headerCell = cell as! HeaderCell
            let scrollContentOffsetY = headerCell.timeScrollView.contentOffset.y
            // Dont use setContentOffset because this will call scrollViewDidScroll each time
            headerCell.timeScrollView.contentOffset = CGPoint(x: contentOffsetX, y: scrollContentOffsetY)
        } else {
            let signalCell = cell as! SignalCell
            let scrollContentOffsetY = signalCell.signalScrollView.contentOffset.y
            // Dont use setContentOffset because this will call scrollViewDidScroll each time
            signalCell.signalScrollView.contentOffset = CGPoint(x: contentOffsetX, y: scrollContentOffsetY)
        }
    }
}

0 个答案:

没有答案