我有一个其中有uiview的tablviewcell。
基于某种逻辑,我更改了背景颜色,并使左右角变圆了。
我从cellForRowat indexPath函数使这些视图转角。
这是我的扩展名。
extension UIView {
func roundCorners(corners: UIRectCorner, radius: CGFloat) {
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
以及我如何使用它
cell?.myCustomView.roundCorners(corners: [.bottomRight,.bottomLeft], radius: 10.0)
当iPhone的宽度为375时,它的工作状况很好,
但是无法更新宽度大于375的设备。
滚动表格视图后,它会再次正确地向后拉伸到所需的宽度。
如何解决这个问题呢 ?
最佳答案
当视图更改大小时,您想更新路径。在cellForRowAt
中,该单元尚未通过自动布局完全布局。
所以...
为“圆角”视图创建一个UIView
子类(简单示例):
class RoundedCornersView: UIView {
var corners: UIRectCorner = UIRectCorner()
var radius: CGFloat = 0.0
override func layoutSubviews() {
super.layoutSubviews()
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
现在,只要视图更改大小(例如,首次使用或设备旋转时),该视图就会自动更新路径。
这是在表单元格中使用它的方式。在情节提要中,将“背景视图”的类设置为
RoundedCornersView
class RoundedCornersView: UIView {
var corners: UIRectCorner = UIRectCorner()
var radius: CGFloat = 0.0
override func layoutSubviews() {
super.layoutSubviews()
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
class MyTestCell: UITableViewCell {
@IBOutlet var myCustomView: RoundedCornersView!
}
然后,在
cellForRowAt
中: let cell = tableView.dequeueReusableCell(withIdentifier: "MyTestCell", for: indexPath) as! MyTestCell
if shouldBeRounded {
cell.myCustomView.corners = [.bottomRight, .bottomLeft]
cell.myCustomView.radius = 10.0
cell.myCustomView.backgroundColor = .green
} else {
cell.myCustomView.corners = []
cell.myCustomView.radius = 0.0
cell.myCustomView.backgroundColor = .white
}
return cell