reloadSections后,阴影在UITableView中保留:

时间:2015-04-26 22:28:59

标签: ios uitableview cocoa-touch core-graphics ios-autolayout

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

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

两个阴影

two shadows

稍微向下滚动

one shadow gone

当切换回上一个选项卡时,单元格较高,也存在阴影问题,但这些阴影太短。如上所述,设置阴影路径的代码位于父类中,父类负责制作和布局最顶层的卡#34;包含自定义子细分的视图。

我以编程方式完成所有操作:设置视图和Autolayout。目前,单元格高度是硬编码的。 我不确定哪些信息是相关的,因为我完全不知所措,所以这就是我设置shadowPath的方法。

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

为简单起见,卡片在contentView中使用以下可视格式进行布局:

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

2 个答案:

答案 0 :(得分:3)

无论出于何种原因,即使我使用单独的类并分开reuseIdentifier s,刚出视图端口的第一个重用单元仍然被设置为另一个段中的高单元格。当我改变了

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

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

答案 1 :(得分: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
}