【问题标题】:How to create the shadow of material-like table view cells?如何创建类似材质的表格视图单元格的阴影?
【发布时间】:2019-11-21 00:10:33
【问题描述】:

我正在尝试使我的表格视图单元格看起来“有材料”。这是类似于我想做的事情(source):

请注意,上图中整个表格视图周围有一个阴影。我想要的是那个阴影,但应用于每个表格视图单元格,而不是整个表格视图。

我首先在 XIB 文件中设计了我的单元格。我将一个名为containerViewUIView 作为内容视图的子视图。我添加了约束,使containerView 的上、下、左、右边距为 8。这是为了使containerView 比内容视图小一点,这样我放在它上面的阴影就会可见.

我还添加了一个名为labelUILabel 作为containerView 的子视图以显示一些文本。

这是UITableViewCell 子类:

class QueueItemCell: UITableViewCell {
    @IBOutlet var label: UILabel!
    @IBOutlet var container: UIView!

    override func setHighlighted(_ highlighted: Bool, animated: Bool) {
        ...
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        ...
    }

    override func awakeFromNib() {
        container.layer.shadowColor = UIColor.black.cgColor
        container.layer.shadowOpacity = 0.7
        container.layer.shadowOffset = CGSize(width: 3, height: 9)
        container.layer.shadowRadius = 4
        container.layer.cornerRadius = 4
        container.layer.shadowPath = UIBezierPath(roundedRect: container.bounds, cornerRadius: 4).cgPath
        selectionStyle = .none
    }
}

数据源和委托方法没有什么特别之处,只是我在heightForRowAt中将单元格的高度设置为61。

当我运行应用程序时,我得到了这样的结果:

底部和左侧边缘的阴影非常好。但右边缘是一场彻头彻尾的灾难。顶部边缘也没有阴影,这是不希望的。我尝试对shadowPathshadowOffset 进行反复试验,但总有一两个边缘看起来很糟糕。

如何在单元格的所有边缘实现阴影,如第一张图片所示?

【问题讨论】:

  • 我认为添加简单阴影不需要阴影路径。

标签: ios swift calayer shadow


【解决方案1】:

awakeFromNib 中,您的视图大小有误。您需要将container.layer.shadowPath = UIBezierPath(roundedRect: container.bounds, cornerRadius: 4).cgPath 移动到layoutSubviews

或删除此代码

container.layer.shadowPath = UIBezierPath(roundedRect: container.bounds, cornerRadius: 4).cgPath

所以影子会自动配置

【讨论】:

  • 将其移至 layoutSubviews 会产生与以前相同的结果,但将其删除并将 shadowOffset 更改为 0 可以。我从来不知道shadowPath 是可选的!
  • 你也可以试试UIBezierPath(rect:)而不是UIBezierPath(roundedRect:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多