Warm tip: This article is reproduced from serverfault.com, please click

swift-UITableView的缓存阴影路径

(swift - Cached shadow path for UITableView)

发布于 2020-11-27 19:14:33

我想缓存一条阴影路径以使性能UITableView更好。

我读过https://yalantis.com/blog/mastering-uikit-performance/

if let rect = cell.imageView?.bounds {
    cell.imageView?.layer.shadowPath = UIBezierPath(rect: rect).cgPath
}

将停止屏幕外的阴影,但是使用以下功能

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = "Cell data: \(data[indexPath.row])"
        
        if let rect = cell.imageView?.bounds {
          cell.imageView?.layer.shadowPath = UIBezierPath(rect: rect).cgPath
        }
        
        cell.imageView?.layer.shadowRadius = 8
        cell.imageView?.layer.shadowOffset = CGSize(width: 3, height: 3)
        cell.imageView?.layer.shadowOpacity = 0.5
        
        
        cell.imageView?.layer.cornerRadius = 20
        cell.imageView?.image = UIImage(named: "PlaceholderImage")
        return cell
    }

产生一个结果,其中有些单元格有阴影,有些则没有。

在此处输入图片说明

如何在一个简单的方法中实现对所有单元格的影子路径的缓存 UITableView

Questioner
WishIHadThreeGuns
Viewed
0
matt 2020-11-28 09:56:14

问题是这些行:

    if let rect = cell.imageView?.bounds {
        cell.imageView?.layer.shadowPath = UIBezierPath(rect: rect).cgPath
    }

如果imageView从未为该单元分配图像,frame则为.zero,因此bounds.zero因此,shadowPath最终cgPath得到的只是一个点,并且没有阴影出现。

我要解决的方法是完全不使用内置imageView属性。我将在我自己的图像视图中使用可以控制其帧的自定义单元类,而不是imageView播放这些技巧的内置单元