dequeueReusableCell打破了cliptobounds

时间:2016-11-18 19:30:38

标签: ios swift uiscrollview autolayout

我有一个非常简单的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;
}

但结果看起来总是一样的。每行的高度都是固定的。

1 个答案:

答案 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)
}

根据.zPositionApple Developer Documentation)的文档:

  

此属性的默认值为0.更改此属性的值会更改屏幕上图层的前后排序。较高的值使该层在视觉上比具有较低值的层更靠近观察者。这会影响框架矩形重叠的图层的可见性。

因此,我将当前单元格的 minuend dataSource当前indexPath.row计数器用作 subtrahend 来计算zPosition每个细胞的层。

  

您可以下载我的游乐场here的完整版。