【问题标题】:How to set attributes of the *next* character that is typed in NSTextStorage如何设置在 NSTextStorage 中键入的 *next* 字符的属性
【发布时间】:2021-07-09 17:48:02
【问题描述】:

在NSTextStorage 的给定范围内更改文本属性非常简单。

storage.addAttribute(.font, value: UIFont.systemFont(ofSize: 30), at: range)

但是如何改变当前光标位置的属性,让下一个字符有不同的属性呢?

(想想有人在没有选择文本的情况下单击工具栏中的“粗体”按钮。没有文本变为粗体,但下一个字符是粗体。)

【问题讨论】:

  • 'range' 说明了一切。
  • 只是一个建议:找到光标位置,并从那里创建一个长度为 0 的范围,并将该范围传递给 addAttribute?
  • 也想到了,但是长度 0 不应用属性。看起来它是typingAttributes >。

标签: ios swift


【解决方案1】:

您可以使用UITextView.typingAttributes 来实现此目的。

该字典包含应用于新键入的文本的属性键(和相应的值)。当文本视图的选择发生变化时,字典的内容会自动清除。

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    // This is the key part
    textView.typingAttributes = myCurrentAttributes

    // Allow system to control typing
    return true
}

【讨论】:

  • 这似乎可行,但在添加新字符之前,光标不会反映打字属性。你知道如何解决这个问题吗?
  • 与其等到用户真正键入内容后再设置类型属性,不如在更改它们时立即尝试设置类型属性。我不确定它是否会按照您想要的方式工作,值得一试。
  • 不抱歉,这就是我的意思。就像上面的代码shouldChange 被调用并将打字属性设置为更大的字体。但它在 textView 中的光标仍然看起来是较小字体的大小。当您添加一个字符时,它会在插入具有新字体大小的字符时跳跃并变大。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多