您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

UITableViewCell:圆角和阴影

UITableViewCell:圆角和阴影

这个问题适时出现了!我实际上只是自己解决了同样的问题。

        cell.mainBackground.layer.cornerRadius = 8  
    cell.mainBackground.layer.masksToBounds = true

    cell.shadowLayer.layer.masksToBounds = false
    cell.shadowLayer.layer.shadowOffset = CGSizeMake(0, 0)
    cell.shadowLayer.layer.shadowColor = UIColor.blackColor().CGColor
    cell.shadowLayer.layer.shadowOpacity = 0.23
    cell.shadowLayer.layer.shadowRadius = 4

但是,这里的问题是:为每个单个单元格计算阴影是一项缓慢的任务。当您滚动浏览表格时,您会注意到一些严重的延迟。解决此问题的最佳方法UIBezierPath为阴影定义一个,然后对其进行栅格化。因此,您可能需要这样做:

    cell.shadowLayer.layer.shadowPath = UIBezierPath(roundedRect: cell.shadowLayer.bounds, byRoundingCorners: .AllCorners, cornerRadii: CGSize(width: 8, height: 8)).CGPath
    cell.shadowLayer.layer.shouldRasterize = true
    cell.shadowLayer.layer.rasterizationScale = UIScreen.mainScreen().scale

但这带来了一个新问题!的形状UIBezierPath取决于shadowLayer的边界,但是在cellForRowAtIndexPath调用时间之前边界没有正确设置。因此,您需要调整shadowPath基于shadowLayer的范围。做到这一点的最佳方法是将其子类化UIView,并将属性观察器添加到bounds属性中。然后在中设置阴影的所有属性didSet。切记shadowLayer在情节提要中更改您的类以匹配新的子类。

class ShadowView: UIView {
    override var bounds: CGRect {
        didSet {
            setupShadow()
        }
    }

    private func setupShadow() {
        self.layer.cornerRadius = 8
        self.layer.shadowOffset = CGSize(width: 0, height: 3)
        self.layer.shadowRadius = 3
        self.layer.shadowOpacity = 0.3
        self.layer.shadowPath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 8, height: 8)).cgPath
        self.layer.shouldRasterize = true
        self.layer.rasterizationScale = UIScreen.main.scale
    }
}
其他 2022/1/1 18:14:07 有501人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶