将UITableViewCell置于兄弟姐妹之下

时间:2015-06-24 12:09:04

标签: ios swift uitableview cocoa-touch

我正在尝试构建一个自定义UITableView,其行为与提醒应用程序类似。

我想让它被下一个单元格覆盖,而不是从显示器滚动到最顶层的可见单元格,这样当你滚动时单元格就会叠加在一起。

目前我正在使用:

override func scrollViewDidScroll(scrollView: UIScrollView) {

  let topIndexPath: NSIndexPath = tableView.indexPathsForVisibleRows()?.first as! NSIndexPath

  let topCell = tableView.cellForRowAtIndexPath(topIndexPath)

  let frame = topCell!.frame

  topCell!.frame = CGRectMake(frame.origin.x, scrollView.contentOffset.y, frame.size.width, frame.size.height)
}

但顶部单元格始终位于第二个单元格之上 - 导致第二个单元格在其下滚动。

此外,如果我快速滚动,这似乎错放了我的所有细胞。

编辑:修好了。在下面发布的答案供将来参考。

1 个答案:

答案 0 :(得分:0)

对于将来搜索此内容的任何人。 只需遍历所有可见单元格并将其z位置设置为行号(因此每个单元格堆叠在前一个单元格之上)。

if语句告诉顶部单元格保留在scrollview的contentOffset中,并让所有其他单元格保持其预期位置。如果滚动得太快,这会阻止其他单元格偏移。

override func scrollViewDidScroll(scrollView: UIScrollView) {

  // Grab visible index paths
  let indexPaths: Array = tableView.indexPathsForVisibleRows()!

  var i = 0
  for path in indexPaths {
    let cell = tableView.cellForRowAtIndexPath(path as! NSIndexPath)
    // set zPosition to row value (for stacking)
    cell?.layer.zPosition = CGFloat(path.row)

    // Check if top cell (first in indexPaths)
    if (i == 0) {
      let frame = cell!.frame

      // keep top cell at the contentOffset of the scrollview (top of screen)
      cell!.frame = CGRectMake(frame.origin.x,
                                scrollView.contentOffset.y,
                                frame.size.width,
                                frame.size.height)
    } else {
      // set cell's frame to expected value
      cell!.frame = tableView.rectForRowAtIndexPath(path as! NSIndexPath)
    }
    i++
  }

}