【问题标题】:dashed border not working for UITableview cell's child view(dashed border width and hight not same as the view)虚线边框不适用于 UITableview 单元格的子视图(虚线边框宽度和高度与视图不同)
【发布时间】:2021-09-23 13:18:32
【问题描述】:

在这里您可以看到 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 的 awake 中调用这个函数,如下所示: view.addDashedBorder().

【问题讨论】:

    标签: ios swift xcode uitableview


    【解决方案1】:

    更简单的方法...

    子类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() 调用。

    【讨论】:

      【解决方案2】:

      问题原因:您正在调用您的边框,添加来自 awakeFromNib 的代码。

      • 在加载 nib 时调用 Awake from,因此您的单元格不会具有所有子视图的确切大小,当调用 awakeFromNib 时,所有视图的大小都与 nib 设计相同。所以当您设置或更新与任何视图大小相关的内容时,从笔尖醒来是错误的地方。

      解决方案:正确的地方是func layoutSubviews()

      • layoutSubviews() 在任何子视图的大小将被更改或视图/子视图的框架第一次更新时被调用。

      • 这是添加边框或视图的正确位置,并确保它只会调用一次添加边框,因为如果任何子视图的框架发生变化,layoutSubviews 将获得多次调用。**

      参考: https://developer.apple.com/documentation/uikit/uiview/1622482-layoutsubviews

      【讨论】:

      • 覆盖 func layoutSubviews() { print("layout working") super.layoutSubviews() view.addDashedBorder() }。我已经尝试过这个..但还没有改变
      • 小修正:您需要创建一次形状图层(在 awakeFromNib 中很好)。您需要将形状图层保存到一个实例变量中,以便以后可以引用它。然后你需要在 layoutSubviews 中构建并安装路径到形状层中。 (layoutSubviews 可以多次调用。)
      • override func layoutSubviews() { super.layoutSubviews() let frameSize = imageVW.frame.size let shapeRect = CGRect(x: 0, y: 0, width: frameSize.width, height: frameSize. height) shapeLayer.path = UIBezierPath(roundedRect: shapeRect,cornerRadius: 4).cgPath imageVW.layer.addSublayer(shapeLayer) layoutIfNeeded() } 我已经尝试过但同样的.. 我在顶部声明了那个形状层并给出了所有值awakeFromNib 最后我设置了布局子视图的路径
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多