显示带有不间断空格和多行的 NSAttributedString 的 Swift 错误

Posted

技术标签:

【中文标题】显示带有不间断空格和多行的 NSAttributedString 的 Swift 错误【英文标题】:Swift Error Displaying NSAttributedString with Non-Breaking Spaces and Multiple Lines 【发布时间】:2018-05-17 20:10:52 【问题描述】:

抱歉,如果这很明显,但我已经搜索了一段时间,这个让我很困惑。

我有一个 NSAttributedString,其中包含:

1) 一个“填空”式子字符串,由不间断空格组成,并带有应用于该子字符串的下划线样式(例如“\u00a0\u00a0\u00a0 " 下划线样式仅应用于该子字符串;我最初使用的是下划线,但它们之间的空格是有问题的,因为我的文本具有不透明度,因此您可以看到之间的空格或重叠)

2) 字符串末尾有多个换行符,可以选择填充空白(例如“...\na)第一选择\nb)第二选择\nc)最后选择”)

然后,我在 numberOfLines 设置为 0 的标签中显示此 NSAttributedString。

这在 90% 的情况下都可以正常工作,但在 10% 的情况下,不间断的“填充空白”出现在行尾的环绕距离内,这意味着它被推到下一行(如预期的那样),它将所有其他文本向前推,如果在整个段落中发生足够多的推动,它会将最后的“选择”行(例如“\nc)最后选择”)完全推出标签,所以它不显示字符串的最后一行!?换句话说,我的标签 SEEMS 可以计算在应用不间断空格之前它需要多大,因此如果随后由不间断空格/子字符串创建了额外的行,则最后一行将被切掉并且不显示在全部。

是否有其他方法可以创建或归因于这个不间断的“填充空白”,这样它就不会进行字符换行(即保持在同一行),但我的标签会理解/重新计算是否通过所述非包装创建了额外的行?正如我所提到的,我的标签已经将 numberOfLines 设置为 0;也许我无法找到某种段落样式或其他标签设置?或者这只是一个 Swift 错误,但有人知道解决方法?

以下是我的代码中的一些 sn-ps:

let underlineString = "\u00a0\u00a0\u00a0\u00a0\u00a0"
let myTextAttributes = [NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue): UIFont(name: "My Font", size: round(self.view.frame.width / 15)) as Any, NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue): UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 0.9)]

let myLabel = UILabel()
myLabel.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
myLabel.textAlignment = .center
myLabel.numberOfLines = 0

var myText = "What do you think about \u00a0\u00a0\u00a0\u00a0\u00a0 and then what about this extra stuff at the end?\na) first choice\nb) second choice\nc) last choice"
var myAttributedText = NSMutableAttributedString(string:myText, attributes: myTextAttributes)
myAttributedText.addAttribute(NSAttributedStringKey.underlineStyle, value: NSUnderlineStyle.styleThick.rawValue, range: (myText as NSString).range(of:underlineString))
myLabel.attributedText = myAttributedText
self.view.addSubview(myLabel)

myLabel.translatesAutoresizingMaskIntoConstraints = false
myLabel.heightAnchor.constraint(equalToConstant: self.view.frame.height).isActive = true
myLabel.widthAnchor.constraint(equalToConstant: self.view.frame.width).isActive = true
myLabel.centerXAnchor.constraint(equalTo: myLabel.superview!.centerXAnchor).isActive = true
myLabel.centerYAnchor.constraint(equalTo: myLabel.superview!.centerYAnchor).isActive = true

非常感谢您抽出宝贵时间!

【问题讨论】:

【参考方案1】:

经过更多研究,很明显 UILabel 现在在属性字符串方面存在很多错误,因此不确定是否有解决上述非破坏空间问题的技术解决方法。

话虽如此,我可以通过将“填充空白”子字符串切换回常规字符、将这些字符的前景颜色设置为清除,然后设置下划线颜色来解决这个特定的错误为白色,因此它不会采用前景颜色。

【讨论】:

以上是关于显示带有不间断空格和多行的 NSAttributedString 的 Swift 错误的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 将不间断空格转换为空格?

Spark Dataframe的多行字符串不间断

捆绑显示名称缺少空格字符

将不间断空格转换为 Ruby 中的空格

VSCode插入“不间断空格”而不是常规空格

术语:制表符是不间断空格吗?