我正在尝试构建一个自定义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)
}
但顶部单元格始终位于第二个单元格之上 - 导致第二个单元格在其下滚动。
此外,如果我快速滚动,这似乎错放了我的所有细胞。
编辑:修好了。在下面发布的答案供将来参考。
答案 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++
}
}