将字符串添加到 NSMutableAttributedString 时出错
Error when adding a string to a NSMutableAttributedString
我有这个功能可以将项目符号添加到 textView
let bullet: String = " ● "
func setAttributedValueForBullets(bullet: String, positionWhereTheCursorIs: Int?) {
var textRange = selectedRange
let selectedText = NSMutableAttributedString(attributedString: attributedText)
if let line = positionWhereTheCursorIs {
textRange.location = line
}
selectedText.mutableString.replaceCharacters(in: textRange, with: bullet)
let paragraphStyle = createParagraphAttribute()
selectedText.addAttributes([NSParagraphStyleAttributeName: paragraphStyle], range: NSMakeRange(textRange.location, bullet.length))
self.attributedText = selectedText
self.selectedRange = textRange
}
在像这样只有一行的段落中插入项目符号时,它会起作用
但是当我将它添加到多行的段落中时,就会发生这种情况
我希望它看起来像第一张图片,项目符号和文本开头没有 space
我也试过用
selectedText.insert(bullet, at: textRange.location)
而不是
selectedText.addAttributes([NSParagraphStyleAttributeName: paragraphStyle], range: NSMakeRange(textRange.location, bullet.length))
func attributeString() -> NSAttributedString{
let attribute = NSMutableAttributedString(string: "●DESCRIPTION\n", attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 14)])
let style = NSMutableParagraphStyle()
style.lineSpacing = 10
let range = NSMakeRange(0, attribute.string.characters.count)
attribute.addAttribute(NSParagraphStyleAttributeName, value: style, range: range)
return attribute
}
这实际上是因为要点和详细描述之间的 space。如果描述太长,它会按照正常行为继续自己的行,将字符串的其余部分换行。
最简单的解决方法是使用不间断的 unicode space 字符 (u00A0):
let bullet = "●\u{00A0}"
let string = "thisisaveryveryveryveryveryveryveryveryveryverylongstring"
textView.text = bullet + string
这将导致预期的行为,其中很长的字符串不会分成自己的行,因为它将连接到前面的项目符号点:
另外,如果子弹和弦之间的space太小,干脆把多个不间断的space串起来:
let bullet = "●\u{00A0}\u{00A0}"
我有这个功能可以将项目符号添加到 textView
let bullet: String = " ● "
func setAttributedValueForBullets(bullet: String, positionWhereTheCursorIs: Int?) {
var textRange = selectedRange
let selectedText = NSMutableAttributedString(attributedString: attributedText)
if let line = positionWhereTheCursorIs {
textRange.location = line
}
selectedText.mutableString.replaceCharacters(in: textRange, with: bullet)
let paragraphStyle = createParagraphAttribute()
selectedText.addAttributes([NSParagraphStyleAttributeName: paragraphStyle], range: NSMakeRange(textRange.location, bullet.length))
self.attributedText = selectedText
self.selectedRange = textRange
}
在像这样只有一行的段落中插入项目符号时,它会起作用
但是当我将它添加到多行的段落中时,就会发生这种情况
我希望它看起来像第一张图片,项目符号和文本开头没有 space
我也试过用
selectedText.insert(bullet, at: textRange.location)
而不是
selectedText.addAttributes([NSParagraphStyleAttributeName: paragraphStyle], range: NSMakeRange(textRange.location, bullet.length))
func attributeString() -> NSAttributedString{
let attribute = NSMutableAttributedString(string: "●DESCRIPTION\n", attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 14)])
let style = NSMutableParagraphStyle()
style.lineSpacing = 10
let range = NSMakeRange(0, attribute.string.characters.count)
attribute.addAttribute(NSParagraphStyleAttributeName, value: style, range: range)
return attribute
}
这实际上是因为要点和详细描述之间的 space。如果描述太长,它会按照正常行为继续自己的行,将字符串的其余部分换行。
最简单的解决方法是使用不间断的 unicode space 字符 (u00A0):
let bullet = "●\u{00A0}"
let string = "thisisaveryveryveryveryveryveryveryveryveryverylongstring"
textView.text = bullet + string
这将导致预期的行为,其中很长的字符串不会分成自己的行,因为它将连接到前面的项目符号点:
另外,如果子弹和弦之间的space太小,干脆把多个不间断的space串起来:
let bullet = "●\u{00A0}\u{00A0}"