0

我有这个功能可以将项目符号添加到 textView

让子弹:字符串=“●”

    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
}

它在将项目符号插入只有一行这样的段落时起作用

项目符号只有一行

但是当我将它添加到一个多行的段落中时,就会发生这种情况 多于一行的项目符号

我希望它看起来像第一张图片,没有项目符号中的空格和文本的开头

我也尝试过使用 selectedText.insert(bullet, at: textRange.location)

代替 selectedText.addAttributes([NSParagraphStyleAttributeName: paragraphStyle], range: NSMakeRange(textRange.location, bullet.length))

4

2 回答 2

0
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
    }
于 2017-06-13T19:04:28.123 回答
0

这基本上是由于项目符号点和长描述之间的空间而发生的。如果描述太长,它会按照正常行为继续到它自己的行,将字符串的其余部分包裹起来。

最简单的解决方法是使用不间断的 unicode 空格字符(u00A0):

let bullet = "●\u{00A0}"
let string = "thisisaveryveryveryveryveryveryveryveryveryverylongstring"
textView.text = bullet + string

这将导致预期的行为,其中很长的字符串不会中断它自己的行,因为它将连接到前面的项目符号点:

文本视图

此外,如果项目符号和字符串之间的空间太小,只需将多个不间断空格串在一起:

let bullet = "●\u{00A0}\u{00A0}"
于 2017-06-13T20:28:23.500 回答