添加 UIView 以覆盖整个 UITableViewCell 以及 iOS 10 中的附属视图

Add UIView to cover the whole UITableViewCell along with accessory view in iOS 10

我有一个相当简单的带有标准附件视图的自定义单元格。

在某些时候,我需要执行一个动画,用彩色视图覆盖整个单元格,彩色视图的中心有一个图像。当我这样做时,我在 iPhone 5 和 iOS 10.2 上遇到了奇怪的问题。

我就是这样做的:

  1. 使用 nib 文件创建 UITableViewCell 的子类。

  2. 将 UIView coverView 作为子视图直接添加 (self.addSubview(self.coverView)) 到我的自定义单元格中(因为我也需要覆盖附件视图,所以我无法将其添加到contentView) 在初始化方法中。 coverView 是在没有布局约束的情况下以编程方式创建的。 UIImageView 通过布局约束以编程方式添加到其中,并且 translatesAutoresizingMaskIntoConstraints 设置为 false

  3. 添加方法:

    func animateCState() {

    self.coverView.frame = self.bounds
    self.coverView.frame.origin.y = -self.frame.size.height
    self.bringSubview(toFront: self.coverView)
    UIView.animate(withDuration: 0.3, animations: {
         self.coverView.frame.origin.y = 0
    })  
    

    }

  4. 当用户点击单元格时调用 animateCState

我的期望:绿色视图,中间有图像从顶部幻灯片

我得到的结果:明显透明的视图从顶部滑出,几乎在动画结束时闪烁为绿色。我可以看到 imageView 在适当的位置滑动。

问题:如何将覆盖整个 UITableViewCell(带有附属视图)的视图添加到一个单元格并使其具有动画效果?

好的。看来我已经想通了。

显然 UITableView 或 UITableViewCell 对在 prepareForReuse 之后或其他时间点直接添加到单元格的所有视图做了一些事情(将 .clear 颜色设置为背景)。在我做动画之前,我必须在 animateCState 函数中设置我想要的颜色。

所以我的有效方法如下所示:

func animateCState() {

    self.coverView.frame = self.bounds
    self.coverView.frame.origin.y = -self.frame.size.height
    self.bringSubview(toFront: self.coverView)
    self.coverView.backgroundCOlor = .green
    UIView.animate(withDuration: 0.3, animations: {
        self.coverView.frame.origin.y = 0
    })  
}