如何解决虚线边框不适用于 UITableview 单元格的子视图虚线边框宽度和高度与视图不同
在这里您可以看到 TableViewell 中的视图:
func addDashedBorder()
{
let color = UIColor(displayP3Red: 178.0/255.0,green: 181.0/255.0,blue: 200.0/255.0,alpha: 1.0).cgColor
let shapeLayer:CAShapeLayer = CAShapeLayer()
let shapeRect = CGRect(x: 0,y: 0,width: self.frame.size.width,height: self.frame.size.height)
shapeLayer.bounds = shapeRect
shapeLayer.position = CGPoint(x: self.frame.size.width/2,y: self.frame.size.height/2)
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.strokeColor = color
shapeLayer.linewidth = 2
shapeLayer.lineJoin = CAShapeLayerLineJoin.round
shapeLayer.lineDashPattern = [6,3]
shapeLayer.path = UIBezierPath(roundedRect: shapeRect,cornerRadius: 4).cgPath
self.layer.addSublayer(shapeLayer)
}
我正在像这样从 nib 唤醒中调用这个函数:
view.addDashedBorder()
。
解决方法
问题原因:您正在从awakeFromNib 调用您的边框添加代码。
- Awake from 在nib 加载时被调用,这样你的单元格将不会有所有子视图的确切大小,当awakeFromNib 被调用时,所有视图的大小都与nib 设计相同。因此,当您设置或更新与任何视图的大小相关的内容时,从笔尖唤醒是错误的地方。
解决方案:执行此操作的正确位置是 func layoutSubviews()
-
layoutSubviews() 在任何子视图的大小发生变化或视图/子视图的框架第一次更新时被调用。
-
这是添加边框或视图的正确位置,并确保它只会调用一次添加边框,因为如果任何子视图的框架发生变化,layoutSubviews 将收到多次调用。**
参考: https://developer.apple.com/documentation/uikit/uiview/1622482-layoutsubviews
,更简单的方法...
子类UIView
并将边框相关的代码放在里面:
class DashedView: UIView {
let shapeLayer = CAShapeLayer()
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
func commonInit() -> Void {
let color = UIColor(displayP3Red: 178.0/255.0,green: 181.0/255.0,blue: 200.0/255.0,alpha: 1.0).cgColor
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.strokeColor = color
shapeLayer.lineWidth = 2
shapeLayer.lineJoin = CAShapeLayerLineJoin.round
shapeLayer.lineDashPattern = [6,3]
layer.addSublayer(shapeLayer)
}
override func layoutSubviews() {
super.layoutSubviews()
shapeLayer.path = UIBezierPath(roundedRect: bounds,cornerRadius: 4).cgPath
}
}
现在您不需要任何类型的 view.addDashedBorder()
调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。