我有一个非常简单的UIScrollView和一些内容(很多子视图)。此滚动视图用于显示用户发布的一些帖子(图像+文本)。其中一个视图实际上是作者的图像,它溢出底部单元格边界。因此它与后来的细胞重叠,并且使用clipToBounds = false
我能够获得所需的结果。如果我向下滚动,一切都很好。当我开始向上滚动时,之前覆盖的视图会被剪裁。
Cell overlapping working fine Cell overlapping not working (when I scroll up)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = (indexPath.row % 2 == 0) ? "FeedCellLeft" : "FeedCellRight";
let cell = feedScrollView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! FeedCell;
self.setUpCell(cell, atIndexPath: indexPath);
return cell
}
setUpCell
函数只执行一些与UI相关的任务
let row = indexPath.row
cell.postImage.downloadImageFrom(link: rows[row].image, contentMode: .scaleToFill)
cell.postAuthorImage.downloadImageFrom(link: "https://pbs.twimg.com/profile_images/691867591154012160/oaq0n2zy.jpg", contentMode: .scaleToFill)
cell.postAuthorImage.layer.cornerRadius = 22.0;
cell.postAuthorImage.layer.borderColor = UIColor.white.cgColor
cell.postAuthorImage.layer.borderWidth = 2.0;
cell.postAuthorImage.layer.masksToBounds = true;
cell.selectionStyle = .none
cell.postData.layer.cornerRadius = 10.0;
cell.contentView.superview?.clipsToBounds = false;
cell.clipsToBounds = false;
if (indexPath.row % 2 != 0) {
cell.postData.transform = CGAffineTransform.init(rotationAngle: (4 * .pi) / 180);
} else {
cell.postData.transform = CGAffineTransform.init(rotationAngle: (-4 * .pi) / 180);
}
似乎deque操作打破了我所做的布局(使用autolayout)。我尝试了很多这样的解决方案
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.contentView.superview?.clipsToBounds = false;
cell.clipsToBounds = false;
cell.contentView.clipsToBounds = false;
}
但结果看起来总是一样的。每行的高度都是固定的。
答案 0 :(得分:3)
我认为问题在于子视图的层次结构。当您向下滚动时,您的单元格从上到下出列并以相同的顺序添加到UITableView
,所有看起来都很好。因为前一个单元格在视图层次结构中高于以下单元格。
但是当你向上滚动时,细胞从下到上出列,这意味着顶部的细胞位于前一个细胞的“后面”。您可以使用Debugging View Hierarchies功能轻松检查Xcode。
您可以尝试bringSubviewToFront:
例如:
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.superview.bringSubview(toFront cell)
}
更新版本
我在Playgrounds进行了一些小型研究,发现只有一个合理的选择来实现重叠单元而没有巨大的性能问题。解决方案基于cell.layer.zPosition
属性并且工作正常(至少在我的Playground中)。我使用以下内容更新了willDisplay cell:
中的代码:
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.layer.zPosition = (CGFloat)(tableView.numberOfRows(inSection: 0) - indexPath.row)
}
根据.zPosition
(Apple Developer Documentation)的文档:
此属性的默认值为0.更改此属性的值会更改屏幕上图层的前后排序。较高的值使该层在视觉上比具有较低值的层更靠近观察者。这会影响框架矩形重叠的图层的可见性。
因此,我将当前单元格的 minuend 和dataSource
当前indexPath.row
计数器用作 subtrahend 来计算zPosition
每个细胞的层。
您可以下载我的游乐场here的完整版。