【问题标题】:Shadows Persist in UITableView after reloadSections:在 reloadSections 后 UITableView 中仍然存在阴影:
【发布时间】:2015-07-05 05:36:33
【问题描述】:

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

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

两个阴影

稍微向下滚动

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

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

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

为简单起见,卡片以contentView 的形式布局,具有以下视觉格式:

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

【问题讨论】:

  • 我已将其范围缩小到 cardView.layer.shadowPath,所以如果有人知道在设置了所有自动布局约束后如何以智能方式设置它,我将不胜感激。

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


【解决方案1】:

无论出于何种原因,即使我使用了单独的类和单独的 reuseIdentifiers,第一个重用的单元格就在视口之外,其大小仍然与另一段中的高单元格相同。当我改变了

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

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

【讨论】:

    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      相关资源
      最近更新 更多