我想像这样在UILabel文本周围绘制轮廓:

ios - iOS:在文字UILabel周围绘制边框-LMLPHP

我尝试使用属性文本,但是没有用于在文本周围呈现边框的属性。仅下划线可用。我也尝试过使用属性文本呈现html,但这也无济于事:

let htmlLabelText = String(format: "<html><body><span style='color:blue; border: 1.5px solid #55DF49; border-radius: 50px;'>%@</span></body></html>", labelText)
var attributedString = NSMutableAttributedString()
guard let stringData = data(using: .unicode) else { return NSMutableAttributedString() }
do {
    attributedString = try NSMutableAttributedString(
        data: stringData,
        options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil
    )
} catch {}

我检查了其他帖子,但没有一个帮助。

最佳答案

对于UILabel来说,这个问题很难解决,因为您没有直接访问NSLayoutManager的权限,这是我解决方案的关键。

我创建了IBDesignable UILabel子类LineHighlightedLabel,可以完成此工作。视觉效果与您提供的图像不太一样,但是可以到达那里。

重要的部分是将文本设置为UILabel作为NSAttributedString,而不仅仅是纯文本。

@IBDesignable
public class LineHighlightedLabel: UILabel {
    public override func draw(_ rect: CGRect) {
        let layoutManager = NSLayoutManager()
        let textStorage = NSTextStorage.init(attributedString: attributedText!)
        textStorage.addLayoutManager(layoutManager)

        let textContainer = NSTextContainer.init(size: bounds.size)
        textContainer.lineFragmentPadding  = 0
        textContainer.maximumNumberOfLines = numberOfLines
        textContainer.lineBreakMode        = lineBreakMode

        layoutManager.addTextContainer(textContainer)

        layoutManager.enumerateLineFragments(forGlyphRange: NSMakeRange(0, textStorage.length)) { (rect, usedRect, textContainer, glyphRange, bool) in
            let lineRect = CGRect(x: usedRect.origin.x, y: usedRect.origin.y + 1, width: usedRect.size.width, height: usedRect.size.height - 2)
            UIColor.green.setStroke()
            let lineRectPath = UIBezierPath(roundedRect: lineRect, cornerRadius: 5)
            lineRectPath.lineWidth = 0.5
            lineRectPath.stroke()
        }

        super.drawText(in: rect)
    }

    public override func layoutSubviews() {
        super.layoutSubviews()
        setNeedsDisplay()
    }
}

LineHighlightedLabel在界面构建器中提供了很好的预览,您可以轻松地使用值。

ios - iOS:在文字UILabel周围绘制边框-LMLPHP

10-04 21:28
查看更多