2

由于我们的设计师是一个虐待狂,我有一个带有分段控件的 UITableView,它可以在单独的提要中的两种不同类型的单元格之间切换。单元格使用不同的标识符和类进行出队——这一切都很好。单元格共享一个父级,但大小不同,出于优化原因,我layer.shadowpath在父级的 layoutSubviews() 中手动设置。我需要阴影:设计师的愿望。

问题是,在我切换到第二部分之后,在桌子下方的一些地方,我认为上面的单元格有阴影悬垂。正如您从第一张图片中看到的那样,有两个阴影,如果我向下滚动以遮挡最顶部的可见单元格,阴影就会消失,这让我相信阴影是偏移的。进一步滚动会使这些阴影消失,并且在再次切换选项卡之前不会再次出现。其余的阴影都很好。

两个影子

两个影子

稍微向下滚动

一个影子不见了

当切换回上一个选项卡时,单元格较高,也存在阴影问题,但这些阴影太短了。如前所述,设置阴影路径的代码在父类中,父类负责制作和布置包含自定义 subCells 的最顶层“卡片”视图。

我以编程方式做所有事情:设置视图和自动布局。当前单元高度是硬编码的。我不确定哪些信息是相关的,因为我完全不知所措,所以这是我设置shadowPath.

override func layoutSubviews() {
    super.layoutSubviews()
    cardView.layer.shadowPath = UIBezierPath(rect: cardView.bounds).CGPath
}

为简单起见,卡片contentView采用以下视觉格式进行布局:

"V:|-marginV-[card]-marginV-|"
"H:|-marginH-[card]-marginH-|"
4

2 回答 2

3

无论出于何种原因,即使我使用了单独的类和单独reuseIdentifier的 s,刚离开视口的第一个重用单元格的大小仍然与另一段中的高单元格相同。当我改变

let cell = tableView.dequeueReusableCellWithIdentifier(booksReuseIdentifier) as! ProfileBookCell 将 indexPath 包含为

let cell = tableView.dequeueReusableCellWithIdentifier(booksReuseIdentifier, forIndexPath: indexPath) as! ProfileBookCell回收问题得到了纠正,并正确计算了界限。我尝试layoutIfNeeded了十几个不同的地方都没有效果,但这解决了它。

于 2015-05-28T17:52:38.697 回答
2

我遇到了同样的问题,我尝试了当前标记的解决方案,但是,似乎没有其他任何方法可以工作。在尝试了这么多其他事情之后,我终于尝试将我的添加阴影代码移动到我的子类 UITableViewCell 的 layoutSubviews 函数中,它终于奏效了!我认为这很有效,因为在调用 layouSubviews 之前,单元格的最终大小并不总是正确计算,并且它需要适当的大小来绘制阴影。

override func layoutSubviews() {
     super.layoutSubviews()
    addShadow(cell: self)
}

private func addShadow(cell:UITableViewCell) {
    cell.layer.shadowOffset = CGSize(width:1, height:1)
    cell.layer.shadowColor = UIColor.black.cgColor
    cell.layer.shadowRadius = 1
    cell.layer.shadowOpacity = 0.6

    cell.clipsToBounds = false

    let shadowFrame: CGRect = (cell.layer.bounds)
    let shadowPath: CGPath = UIBezierPath(rect: shadowFrame).cgPath
    cell.layer.shadowPath = shadowPath
}
于 2017-04-04T09:44:40.817 回答