UITableViewCell:圆角和阴影

我正在更改UITableViewCell的宽度,以使单元格较小,但用户仍可以沿tableview的边缘滚动。

override func layoutSubviews() {        

// Set the width of the cell

self.bounds = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width - 40, self.bounds.size.height)

super.layoutSubviews()

}

然后我转过身来:

cell.layer.cornerRadius = 8

cell.layer.masksToBounds = true

到目前为止一切都很好。问题发生在阴影处。边界被遮盖,因此阴影显然不会出现。我查询了其他答案,但似乎无法弄清楚如何沿边界拐角 显示阴影。

cell.layer.shadowOffset = CGSizeMake(0, 0)

cell.layer.shadowColor = UIColor.blackColor().CGColor

cell.layer.shadowOpacity = 0.23

cell.layer.shadowRadius = 4

所以我的问题–如何减小宽度,圆角并同时向UITableViewCell添加阴影?

尝试R Moyer的答案

尝试R</p><p>Moyer的答案

回答:

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

  1. 在单元格的“内容视图”中创建一个UIView(让我们称其为mainBackground)。这将包含您单元格的所有内容。放置它并在情节提要中应用必要的约束。
  2. 创建另一个UIView。这将是一个带有阴影的阴影(我们将其称为shadowLayer)。完全按照您的方式放置它mainBackground,但是在它后面,并应用相同的约束。
  3. 现在,您应该能够如下设置圆角和阴影:

        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

}

}

以上是 UITableViewCell:圆角和阴影 的全部内容, 来源链接: utcz.com/qa/419836.html

回到顶部