【问题标题】:How add corner radius to dashed border around an UIView如何将角半径添加到 UIView 周围的虚线边框
【发布时间】:2020-06-17 17:19:51
【问题描述】:

我有一个圆角的UIView,并添加了一个虚线描边。

,,,
    var view = CAShapeLayer()
    view.strokeColor = UIColor.red.cgColor
    view.lineDashPattern = [2, 2]
    view.frame = addphotoView.bounds
    view.fillColor = nil
    view.path = UIBezierPath(rect: addphotoView.bounds).cgPath
    view.cornerRadius = 16
    view.masksToBounds = true

    addphotoView.layer.addSublayer(yourViewBorder)

但是view.cornerRadius 没有按预期工作:

角落被消灭了。

【问题讨论】:

  • 由于视觉问题(我在预览图像中遇到的问题),我已经更新了您的代码和图像
  • 哦。谢谢你。我会记得要更加小心。

标签: ios swift uiview calayer


【解决方案1】:

快速解答

你应该将Layers path四舍五入。

像这样:

borderLayer.path = UIBezierPath(roundedRect: addphotoView.bounds, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 16, height: 16)).cgPath


使用扩展更好地回答

您可以将所有这些逻辑移到扩展中:

extension UIView {
    @discardableResult
    func addLineDashedStroke(pattern: [NSNumber]?, radius: CGFloat, color: CGColor) -> CALayer {
        let borderLayer = CAShapeLayer()

        borderLayer.strokeColor = color
        borderLayer.lineDashPattern = pattern
        borderLayer.frame = bounds
        borderLayer.fillColor = nil
        borderLayer.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: radius, height: radius)).cgPath

        layer.addSublayer(borderLayer)
        return borderLayer
    }
}

用法:

addphotoView.addLineDashedStroke(pattern: [2, 2], radius: 16, color: UIColor.gray.cgColor)

【讨论】:

  • 我已经尝试了你的答案,在我的情况下,我在水平堆栈中有两个视图,所以虚线水平从视图中出来。有什么想法吗?
  • 你应该更新层像layoutSubviews
  • 感谢您的扩展!我们能以某种方式避免在路径的起点和终点接触虚线吗?它在您的示例视图屏幕截图中以及左上角旁边可见。
猜你喜欢
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
  • 2022-11-13
  • 2017-07-20
  • 2018-02-20
  • 2013-06-10
相关资源
最近更新 更多