微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

虚线边框不适用于 UITableview 单元格的子视图虚线边框宽度和高度与视图不同

如何解决虚线边框不适用于 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 举报,一经查实,本站将立刻删除。