显示带有非断开空格和多行的NSAttributedString的Swift错误

时间:2018-05-17 20:10:52

标签: swift nsattributedstring line-breaks spaces

道歉,如果这是显而易见的,但我一直在寻找一段时间,而且这个人难倒我。

我有一个NSAttributedString,其中包含:

1)A"填空的" -esque子串由非破坏空格组成,下划线样式应用于该子串(例如" \ u {00a0} \ u {00a0} \ u {00a0}"下划线样式仅应用于该子字符串;我最初使用下划线,但它们之间的空间有问题,因为我的文本具有不透明度,因此您可以看到它们之间的空间或重叠)

2)在字符串末尾有多个换行符,并选择填写空白(例如&#34; ... \ na)第一选择\ nb)第二选择\ nc)最后选择&#34;)< / p>

然后我将这个NSAttributedString显示在numberOfLines设置为0的标签中。

这种方法在90%的时间内都能正常工作,除了10%的时间不打破&#34;填空#34;出现在一条线末端的包裹距离内,这意味着它被推到下一行(如预期的那样),这会向前推动所有其他文本,并且如果在整个段落中发生足够的推动,则会推动最后一行&#34;选择&#34;行(例如&#34; \ nc)最后选择&#34;)完全不在标签之外,因此它不会显示字符串的最后一行!?换句话说,我的标签SEEMS用于计算在应用非中断空格之前需要的大小,因此如果非中断空格/子串创建了额外的行,则最后一行被切断而不显示在所有

是否有其他方法可以创建或归因于这种不打破的空白&#34;填空?&#34;所以它不会包含字符包装(即将它全部保存在同一行)但我的标签会理解/重新计算所述非包装已经创建了额外的行吗?正如我所提到的,我的标签已经将numberOfLines设置为0;也许有某种段落风格或其他标签设置我无法找到?或者它只是一个Swift bug,但那里有人知道一个解决方法?

以下是我的代码中的一些代码:

let underlineString = "\u{00a0}\u{00a0}\u{00a0}\u{00a0}\u{00a0}"
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 \u{00a0}\u{00a0}\u{00a0}\u{00a0}\u{00a0} 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 个答案:

答案 0 :(得分:1)

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

说到这一点,我能够通过切换回常规字符来解决这个特殊的错误,为我的“填空”子字符串,设置outlookColor以清除这些字符,然后设置underlineColor为白色所以它不会采用foregroundColor。