我正在更改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的答案
最佳答案
这个问题适时出现了!我实际上只是自己解决了同样的问题。
UIView
(以下简称为mainBackground
)。这将包含您单元格的所有内容。放置它并在 Storyboard 中应用必要的约束。 UIView
。这将是一个带有阴影的阴影(我们将其称为shadowLayer
)。将其完全定位为mainBackground
,但位于其后,并应用相同的约束。 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
中设置阴影的所有属性。切记在 Storyboard 中更改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
}
}