iOS - 文本视图的图像附件更改属性

时间:2017-06-07 18:22:38

标签: ios uiimage uitextview nstextattachment

我使用给定的属性描述如下UITextView

lazy var inputTextView: UITextView = {
    let tv = UITextView()
    tv.backgroundColor = .white
    tv.textContainerInset = UIEdgeInsetsMake(12, 12, 12, 12) // Posicionamento do texto

    let spacing = NSMutableParagraphStyle()
    spacing.lineSpacing = 4
    let attr = [NSParagraphStyleAttributeName : spacing, NSFontAttributeName: UIFont.systemFont(ofSize: 16),        NSForegroundColorAttributeName: UIColor.blue]
    tv.typingAttributes = attr
    return tv
}()

在将图像附加到UITextView之前,所有内容都按预期工作。

图像会插入到所需的位置,但在插入后会覆盖我的textView属性。

文本变得很小,颜色与我在声明中实现的属性不同。

我正在附加图片如下:

    let att = NSTextAttachment()
    att.image = image
    let attrString = NSAttributedString(attachment: att)
    self.inputTextView.textStorage.insert(attrString, at: self.currentCursorLocation)

造成这个问题的原因是什么?

每当我在其内容中插入UIImage时,我甚至尝试重新强制使用其属性。

添加图片时我尝试了以下操作:

    let att = NSTextAttachment()
    att.image = image
    let attrString = NSAttributedString(attachment: att)
    self.inputTextView.textStorage.insert(attrString, at: self.currentCursorLocation)

    let spacing = NSMutableParagraphStyle()
    spacing.lineSpacing = 4
    let attr = [NSParagraphStyleAttributeName : spacing, NSFontAttributeName: UIFont.systemFont(ofSize: 16), NSForegroundColorAttributeName: UIColor.blue]
    self.inputTextView.typingAttributes = attr

它仍然没有改变它的属性。

造成这个问题的原因是什么?有提示吗?

由于

修改

正如我所建议的那样,我是如何设置光标位置的

func textViewDidChange(_ textView: UITextView) {
    currentCursorLocation = textView.selectedRange.location
}

我这样做是为了将图像插入文本闪烁光标的当前位置

1 个答案:

答案 0 :(得分:1)

[编辑:不幸的是,这并没有解决伊万的问题 - 我留下了答案,因为对于那些不懂Unicode字符编码的人来说这是一个有趣的细节]。

由于Unicode的细微之处,字符串范围规范是不直观的。我希望您的问题是您插入图像的光标位置不是您认为它相对于文本的位置,并且您将图像插入不在Unicode代码点之间的Unicode标量位置,这样您就是破坏unicode代码。要了解为什么会发生这种情况,请参阅此Apple文章。

Strings in Swift 2

我建议在指定字符串范围时使用以下表示法(取自此Stack Overflow答案:NSAttributedString and emojis: issue with positions and lengths)。

// Convert to NSRange by computing the integer distances:
let nsRange = NSRange(location: text.utf16.distance(from: text.utf16.startIndex, to: from16),
                      length: text.utf16.distance(from: from16, to: to16))

但是,如果没有看到如何设置光标位置,我就无法确定这是您问题的根源。 [更新:感谢更新问题以显示光标位置 - 我们到达那里但是对于其他人,请注意,在设置光标位置之后(这本来很好),他将它递增1,这意味着我提到的关于Unicode标量与代码点的问题实际上是问题所在。