如何让NSAttributedString中的链接文本不自动换行?
解决NSTextView中超链接文本被换行拆分的问题
要避免链接文本被换行拆分,核心是给链接文本设置禁止拆分换行的段落样式,确保链接作为一个整体排版。
具体修改步骤:
- 创建自定义段落样式,配置属性防止链接拆分:
let linkParagraphStyle = NSMutableParagraphStyle() linkParagraphStyle.lineBreakMode = .byWordWrapping // 按单词整体换行,避免拆分链接文本 linkParagraphStyle.hyphenationFactor = 0 // 禁用连字符自动拆分单词 linkParagraphStyle.allowsDefaultTighteningForTruncation = false // 禁止文本自动收紧导致的拆分
- 将该段落样式添加到链接的属性集合中:
修改原代码中的linkAttributes,加入段落样式:
let linkAttributes: [NSAttributedString.Key: Any] = [ .foregroundColor: learnMoreFontColor, .paragraphStyle: linkParagraphStyle ]
或者,也可以在给链接添加其他属性后,单独追加段落样式:
attributedString.addAttribute(.paragraphStyle, value: linkParagraphStyle, range: linkRange)
修改后的完整代码示例:
let displayedStringValue = "Learn More" guard let url = URL(string: displayedStringValue) else { return } let linkRange = NSRange(location: detail.count, length: displayedStringValue.count) let fullTextString = "This is sample String" + displayedStringValue let attributedString = NSMutableAttributedString(string: fullTextString) // 配置链接专用段落样式 let linkParagraphStyle = NSMutableParagraphStyle() linkParagraphStyle.lineBreakMode = .byWordWrapping linkParagraphStyle.hyphenationFactor = 0 linkParagraphStyle.allowsDefaultTighteningForTruncation = false let learnMoreFontColor = NSColor.red let linkAttributes: [NSAttributedString.Key: Any] = [ .foregroundColor: learnMoreFontColor, .paragraphStyle: linkParagraphStyle ] attributedString.addAttributes(linkAttributes, range: linkRange) attributedString.addAttribute(.link, value: url, range: linkRange) let font = NSFont.systemFont(ofSize: 14.0) let contentFontColor = NSColor.red let range = NSRange(location: 0, length: attributedString.length) attributedString.addAttribute(.font, value: font, range: range) let contentRange = NSRange(location: 0, length: detail.count) attributedString.addAttribute(.foregroundColor, value: contentFontColor, range: contentRange) myTextField.linkTextAttributes = linkAttributes myTextField.textStorage?.setAttributedString(attributedString)
补充说明:
- 如果主文本有全局段落样式,直接给链接range设置专属段落样式即可覆盖全局配置,确保链接的排版规则优先级更高。
.byWordWrapping模式会确保整个链接(包括多词组合如"Learn More")作为一个整体换行,不会出现拆分到两行的情况。
内容的提问来源于stack exchange,提问作者RRSK01_11
相关产品推荐
相关产品推荐

